Skip to content

NestJS 异常过滤器绑定方式

NestJS 支持局部注册和全局注册两种方式,优先级:局部 > 全局。

局部注册

局部分为控制器和方法,通过 @UseFilters 装饰器注册,仅对当前控制器 / 方法生效:

ts
// src/controllers/user.controller.ts
import { Controller, Get, UseFilters } from '@nestjs/common';
import { HttpExceptionFilter } from '../filters/http-exception.filter';

// 控制器级别:所有方法生效
@Controller('users')
@UseFilters(HttpExceptionFilter)
export class UserController {
  // 方法级别:仅该方法生效(优先级高于控制器)
  @Get()
  @UseFilters(HttpExceptionFilter)
  findAll() {
    throw new HttpException('自定义异常', HttpStatus.BAD_REQUEST);
  }
}

全局级别

  1. 方式一:通过 providers 注册(推荐,支持依赖注入)
ts
// src/app.module.ts
import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { GlobalExceptionFilter } from './filters/global-exception.filter';

@Module({
  providers: [
    {
      provide: APP_FILTER,
      useClass: GlobalExceptionFilter, // 全局注册
    },
  ],
})
export class AppModule {}
  1. 方式二:通过 NestFactory 注册(不支持依赖注入)
ts
// src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { GlobalExceptionFilter } from './filters/global-exception.filter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  // 全局注册异常过滤器
  app.useGlobalFilters(new GlobalExceptionFilter());

  await app.listen(3000);
}
bootstrap();