Обработка ошибок — важнейший аспект любого веб-приложения, в том числе созданного с помощью NestJS. Когда во время выполнения запроса возникает ошибка, важно предоставить клиенту осмысленный ответ. В этой статье мы рассмотрим несколько методов обработки ответов об ошибках в NestJS, дополненных разговорными объяснениями и примерами кода.
- Использование фильтров исключений.
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,
});
}
}
- Глобальные фильтры исключений.
Помимо создания пользовательских фильтров исключений, 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,
});
}
}
- Использование перехватчиков.
Перехватчики 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,
});
}),
);
}
}
- Пользовательские объекты ответа на ошибку.
Вы можете создать настраиваемые объекты ответа на ошибку, чтобы предоставить дополнительные сведения об ошибке. Эти объекты могут включать в себя такие свойства, как коды ошибок, описания ошибок и трассировки стека. Возвращая эти пользовательские объекты ответов об ошибках, вы можете лучше сообщить клиенту о характере ошибки.