首页 > 解决方案 > 如何使依赖注入适用于 NestJS 中的全局异常过滤器?

问题描述

我试图避免使用app.useGlobalFilters(new AllExceptionsFilter(...));,但我正在努力让 DI 将我的自定义 LoggerService 注入到 AllExceptionsFilter 中。

我有我的应用程序模块与 LoggerModule 导入和过滤器定义如下:

import { APP_FILTER } from '@nestjs/core';
...

@Module({
  imports: [LoggerModule],
  providers: [
    {
      provide: APP_FILTER,
      useClass: AllExceptionsFilter,
    },
  ],
})
export default class AppModule {}

异常过滤器(与嵌套文档中的代码几乎相同):

import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common';
import LoggerService from '../modules/logger/logger.service';

@Catch()
export default class AllExceptionsFilter implements ExceptionFilter {
  constructor(private readonly loggerService: LoggerService) {}

  catch(exception: Error, host: ArgumentsHost): void {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    const request = ctx.getRequest();

    console.log(this.loggerService);
    // this.loggerService.error(exception);

    const status =
      exception instanceof HttpException ? exception.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;

    response.status(status).json({
      statusCode: status,
      message: exception.message,
      path: request.url,
    });
  }
}

记录器模块:

@Global()
@Module({
  providers: [LoggerService],
  exports: [LoggerService],
})
export default class LoggerModule {}

你能指出什么是错的,为什么 LoggerService 没有注入到我的 ExceptionFilter 中?

文档参考。

标签: dependency-injectionnestjs

解决方案


我发现了为什么这不起作用。

我的 LoggerService 注释为:@Injectable({ scope: Scope.REQUEST })

我假设因为实例与请求相关联,所以它已经在异常阶段被丢弃。切换到@Injectable({ scope: Scope.TRANSIENT })解决问题。


推荐阅读