NestJS中Logger Service注入ExceptionFilter报错求助
解决NestJS自定义Logger注入ExceptionFilter报错问题
问题原因
通过APP_FILTER全局注册ExceptionFilter时,Nest不会自动处理过滤器构造函数的依赖注入,导致loggerService未被正确实例化,从而抛出Cannot read properties of undefined (reading 'log')错误。
解决方法
方法一:给ExceptionFilter添加@Injectable()装饰器并通过useFactory注册
- 给
HttpExceptionFilter添加@Injectable()装饰器,让Nest识别它为可注入类:
import { Injectable, Catch, ExceptionFilter, HttpException, ArgumentsHost } from '@nestjs/common'; import { LoggerService } from './logger.service'; // 替换为你的LoggerService实际路径 @Injectable() @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { constructor(private readonly loggerService: LoggerService) {} catch(exception: HttpException, host: ArgumentsHost) { // 你的业务逻辑 this.loggerService.log(exception.message, 'error'); // ... } }
- 在AppModule中使用
useFactory手动注入依赖:
import { Module, APP_FILTER } from '@nestjs/common'; import { LoggerService } from './logger.service'; import { HttpExceptionFilter } from './http-exception.filter'; @Module({ providers: [ LoggerService, { provide: APP_FILTER, useFactory: (loggerService: LoggerService) => new HttpExceptionFilter(loggerService), inject: [LoggerService], }, ], }) export class AppModule {}
方法二:模块级注册过滤器(非全局)
如果不需要全局生效,可在特定模块内注册并绑定到控制器:
// 目标模块 @Module({ providers: [LoggerService, HttpExceptionFilter], controllers: [YourTargetController], }) export class YourModule {}
然后在控制器上使用@UseFilters绑定过滤器:
import { Controller, UseFilters } from '@nestjs/common'; import { HttpExceptionFilter } from './http-exception.filter'; @Controller('your-api-path') @UseFilters(HttpExceptionFilter) export class YourTargetController { // ... }
内容的提问来源于stack exchange,提问作者Muhammad Kashif
相关产品推荐
相关产品推荐

