Поиск по сайту
Ctrl + K
Вопросы по Nest.js

Как обрабатывать ошибки в 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 может быть выполнена множеством способов, и выбор метода зависит от ваших потребностей. Глобальные обработчики исключений, встроенные исключения и обработка ошибок внутри сервисов — это основные инструменты, которые позволят вам создавать надежные и устойчивые приложения.

Кроме того, не забывайте добавлять логирование ошибок и уведомления о них, чтобы пользователи могли получать своевременные ответы на возникшие проблемы.