NestJS — асинхронная операция внутри фильтра ошибок

#node.js #nestjs

#node.js #nestjs

Вопрос:

В нашем приложении NestJS мы настроили пользовательский фильтр ошибок, который улавливает ошибки определенного типа. Для этих ошибок нам нужно выполнить запрос в elasticsearch, чтобы записать соответствующую информацию об ошибке. Поскольку запрос elasticsearch является асинхронным, я определил catch метод async :

 @Catch(MyExceptionType)
@Injectable()
export class MyExceptionFilter implements ExceptionFilter {

    constructor(private readonly elasticsearchService: ElasticsearchService) { }

    async catch(exception: MyExceptionType, host: ArgumentsHost) {
        const ctx      = host.switchToHttp();
        const request  = ctx.getRequest<MyRequestModel>();
        const response = ctx.getResponse<MyResponseModel>();

        const elasticSearchPayload = PayloadBuilder.of(request, exception);
        await this.elasticsearchService.report(elasticSearchPayload);
        // ...
        response.status(exception.getStatus()).json({...});
    }
}
  

Теперь — пока это работает нормально, но мне интересно, действительно ли это нормально, поскольку интерфейс ExceptionFilter строго объявляет catch синхронный метод.

Можем ли мы столкнуться с проблемами при выполнении этого?

Ответ №1:

Фильтры исключений должны определять вашу логику обработки ошибок. Я не думаю, что это должно быть проблемой с его асинхронностью, Nest просто не будет ждать завершения логики, однако он не должен вызывать какие-либо другие обработчики исключений из-за того, как написан пользовательский код фильтра.

Комментарии:

1. Спасибо за ваш ответ! Это объяснило бы (правильное) поведение, которое я вижу. Я поддержу ваш ответ, но подождите с его принятием до завтра, может быть, у кого-то еще есть дополнительные данные 🙂