如何使依赖注入适用于 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 应用程序中`@ntegral/nestjs-sentry` 包的依赖注入问题
如何打印 C++ 中捕获的异常的堆栈跟踪和 C++ 中的代码注入