Как обрабатывать ошибки в NestJS?
В NestJS обработка ошибок — это важная часть разработки, которая позволяет обеспечить стабильность и безопасность вашего приложения. Рассмотрим несколько способов, как можно обрабатывать ошибки в NestJS.
1. Глобальный обработчик ошибок
Вы можете создать глобальный обработчик ошибок, который будет перехватывать все необработанные исключения в вашем
приложении. Для этого нужно использовать класс ExceptionFilter
.
Пример создания глобального обработчика ошибок:
import {ExceptionFilter, Catch, ArgumentsHost, HttpException} from '@nestjs/common';
import {Response} from 'express';
@Catch() // Этот декоратор позволяет ловить все возможные ошибки
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: unknown, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest();
const status = exception instanceof HttpException ? exception.getStatus() : 500;
const errorResponse = {
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
};
response.status(status).json(errorResponse);
}
}
Этот фильтр можно зарегистрировать в главном приложении:
import {NestFactory} from '@nestjs/core';
import {AppModule} from './app.module';
import {AllExceptionsFilter} from './all-exceptions.filter';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new AllExceptionsFilter());
await app.listen(3000);
}
bootstrap();
2. Использование встроенных исключений
NestJS уже предоставляет несколько встроенных исключций, такие как HttpException
, которые вы можете использовать для
обработки ошибок через HTTP.
Пример использования HttpException
внутри контроллера:
import {Controller, Get, HttpException, HttpStatus} from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get()
getAllCats() {
throw new HttpException('Кошки не найдены', HttpStatus.NOT_FOUND);
}
}
При возникновении этой ошибки клиент получит статус 404 с сообщением "Кошки не найдены".
3. Обработка ошибок в сервисах
Если вам нужно обрабатывать ошибки на уровне сервисов, то вы можете использовать try-catch
блоки. Это полезно, если вы
работаете с внешними источниками данных или API.
Пример:
import {Injectable, NotFoundException} from '@nestjs/common';
@Injectable()
export class CatsService {
private readonly cats = [];
findCat(id: number) {
const cat = this.cats.find(cat => cat.id === id);
if (!cat) {
throw new NotFoundException(`Кошка с ID ${id} не найдена`);
}
return cat;
}
}
Заключение
Обработка ошибок в NestJS может быть выполнена множеством способов, и выбор метода зависит от ваших потребностей. Глобальные обработчики исключений, встроенные исключения и обработка ошибок внутри сервисов — это основные инструменты, которые позволят вам создавать надежные и устойчивые приложения.
Кроме того, не забывайте добавлять логирование ошибок и уведомления о них, чтобы пользователи могли получать своевременные ответы на возникшие проблемы.