Skip to content

异常过滤器(Exception Filters)

统一捕获和处理异常,返回规范的错误响应格式。

异常过滤器(Exception Filters)

默认行为

Nest 遇到异常时会自动返回 JSON:

json
{
  "statusCode": 400,
  "message": "some error",
  "error": "Bad Request"
}

但实际项目通常需要统一的错误响应格式,比如加 success 字段、时间戳等。

编写自定义异常过滤器

src/common/filters/http-exception.filter.ts

ts
import {
  ExceptionFilter, Catch, ArgumentsHost, HttpException,
} from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();

    response.status(status).json({
      success: false,
      timestamp: new Date().toISOString(),
      path: request.url,
      message: exception.message,
    });
  }
}

逐行解释

代码作用
@Catch(HttpException)只捕获 Nest 的 HTTP 异常,不处理其他类型错误
host.switchToHttp()从 Nest 通用上下文中拿到 HTTP 的 req/res
exception.getStatus()获取 HTTP 状态码(400/401/404 等)
exception.message获取异常消息

应用异常过滤器

方法级(只对这一个路由生效):

ts
@Post()
@UseFilters(HttpExceptionFilter)
create(@Body() dto: CreateCatDto) {
  throw new BadRequestException('手动抛出异常示例');
}

控制器级(整个控制器生效):

ts
@UseFilters(HttpExceptionFilter)
@Controller('cats')
export class CatsController {}

全局注册(推荐,一劳永逸):

ts
// main.ts
import { HttpExceptionFilter } from './common/filters/http-exception.filter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter()); // ← 全局应用
  await app.listen(3000);
}

依赖注入的问题

useGlobalFilters() 注册的过滤器不在模块上下文内,无法注入依赖。如果需要注入 Service,改用 APP_FILTER 提供者:

ts
// app.module.ts
providers: [
  { provide: APP_FILTER, useClass: HttpExceptionFilter },
]

中间件和异常过滤器在请求生命周期中的位置,详见 请求生命周期 专题。


小结

概念一句话注册方式
中间件请求进入 Controller 前的 hookconfigure() 在模块中
异常过滤器统一错误响应格式@UseFilters()useGlobalFilters()
next()中间件必须调用才能放行忘了调用 → 请求卡死
host.switchToHttp()从通用上下文拿到 HTTP 的 req/res过滤器里必用

下一篇预告:拦截器(Interceptors)—— 请求响应的统一转换。