You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NestJS中Logger Service注入ExceptionFilter报错求助

解决NestJS自定义Logger注入ExceptionFilter报错问题

问题原因

通过APP_FILTER全局注册ExceptionFilter时,Nest不会自动处理过滤器构造函数的依赖注入,导致loggerService未被正确实例化,从而抛出Cannot read properties of undefined (reading 'log')错误。

解决方法

方法一:给ExceptionFilter添加@Injectable()装饰器并通过useFactory注册

  1. 给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');
    // ...
  }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 21:28:17