Обработка ответов об ошибках в NestJS: подробное руководство

Обработка ошибок — важнейший аспект любого веб-приложения, в том числе созданного с помощью NestJS. Когда во время выполнения запроса возникает ошибка, важно предоставить клиенту осмысленный ответ. В этой статье мы рассмотрим несколько методов обработки ответов об ошибках в NestJS, дополненных разговорными объяснениями и примерами кода.

  1. Использование фильтров исключений.
    NestJS предоставляет мощный механизм под названием «Фильтры исключений» для обработки исключений и настройки ответов на ошибки. Создав собственный фильтр исключений, вы можете перехватывать определенные типы ошибок и возвращать индивидуальный ответ. Вот пример:
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { HttpException } from '@nestjs/common';
@Catch(HttpException)
export class CustomExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const status = exception.getStatus();
    const message = exception.message;
    response.status(status).json({
      statusCode: status,
      message: message,
    });
  }
}
  1. Глобальные фильтры исключений.
    Помимо создания пользовательских фильтров исключений, NestJS позволяет вам определять глобальные фильтры исключений, которые перехватывают любые необработанные исключения в вашем приложении. Это может быть полезно для возврата согласованных ответов об ошибках по всем маршрутам. Вот пример:
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const status = 500; // Internal Server Error
    const message = 'Something went wrong.';
    response.status(status).json({
      statusCode: status,
      message: message,
    });
  }
}
  1. Использование перехватчиков.
    Перехватчики NestJS позволяют изменить ответ перед его отправкой обратно клиенту. Вы можете использовать перехватчики для преобразования ответов об ошибках в стандартизированный формат или добавления дополнительных метаданных. Вот пример:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable()
export class ErrorInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      catchError(error => {
        const status = error.getStatus();
        const message = error.message;
        return throwError({
          statusCode: status,
          message: message,
        });
      }),
    );
  }
}
  1. Пользовательские объекты ответа на ошибку.
    Вы можете создать настраиваемые объекты ответа на ошибку, чтобы предоставить дополнительные сведения об ошибке. Эти объекты могут включать в себя такие свойства, как коды ошибок, описания ошибок и трассировки стека. Возвращая эти пользовательские объекты ответов об ошибках, вы можете лучше сообщить клиенту о характере ошибки.