如何使依赖注入适用于 NestJS 中的全局异常过滤器?

Posted

技术标签:

【中文标题】如何使依赖注入适用于 NestJS 中的全局异常过滤器?【英文标题】:How to make Dependency Injection work for global Exception Filter in NestJS? 【发布时间】:2020-08-28 12:44:16 【问题描述】:

我试图避免使用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 中?

Documentation reference.

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何使依赖注入适用于 NestJS 中的全局异常过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

nestjs 全局 pubsub 实例和依赖注入

NestJS:依赖注入和提供者注册

Nestjs 应用程序中`@ntegral/nestjs-sentry` 包的依赖注入问题

如何打印 C++ 中捕获的异常的堆栈跟踪和 C++ 中的代码注入

nestjs 单元测试 createTestingModule 依赖注入

Nestjs 依赖注入 - 将服务注入服务