#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. Спасибо за ваш ответ! Это объяснило бы (правильное) поведение, которое я вижу. Я поддержу ваш ответ, но подождите с его принятием до завтра, может быть, у кого-то еще есть дополнительные данные 🙂