dependency-injection - 如何使依赖注入适用于 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 中?
解决方案
我发现了为什么这不起作用。
我的 LoggerService 注释为:@Injectable({ scope: Scope.REQUEST })
我假设因为实例与请求相关联,所以它已经在异常阶段被丢弃。切换到@Injectable({ scope: Scope.TRANSIENT })
解决问题。
推荐阅读
- javascript - 在 contenteditable 光标中添加 span 标签后,在 IOS safari 中移动到结束
- postgresql - Postgres 将 json 数组数据存储为 jsonb 或 jsonb[] 类型时的性能影响
- rx-java - RxJava:防止一个可观察对象发出,直到另一个可观察对象的数据被发出
- javascript - Laravel,vuejs,Axios,JavaScript中的文本框唯一值
- amazon-web-services - 从 api-gateway 连接 step 函数的 URI
- php - 请修复此问题注意:未定义索引:用户名和密码
- javascript - Angular:格式化时刻以在html中显示为日期
- flutter - 如何预加载 Image.network
- python - 计算时间序列中的最高连续值
- vba - 在 Access VBA 中,是否可以将子表单源对象设置为查询但没有查询。作为前缀?