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);
}
}全局级别
- 方式一:通过 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 {}- 方式二:通过 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();