Skip to content

NestJS 拦截器

拦截器是用 @Injectable() 装饰器注释并实现 NestInterceptor 接口的类。基于 AOP(面向切面编程)思想设计,能够拦截请求 / 响应生命周期、修改数据流、绑定额外逻辑(如日志、缓存、异常处理),并支持异步操作和流式处理。

生命周期位置

排第四位,分为前置和后置

进入控制器的请求(前置处理)

控制器返回的响应(后置处理)

shell
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应

核心特性

  1. 切面编程:分离核心业务与横切逻辑(日志、缓存、鉴权);
  2. 异步支持:基于 RxJS 流处理异步操作(NestJS 底层依赖 RxJS);
  3. 灵活绑定:可绑定到控制器、特定路由、全局范围;
  4. 数据转换:修改请求参数、响应数据或异常格式;
  5. 执行控制:延迟执行、跳过处理器、重试逻辑等。
  6. 适合处理「请求 / 响应生命周期」相关的通用逻辑。

注意事项

  1. 性能考量:全局拦截器会作用于所有请求,避免在拦截器中执行重计算、慢查询;
  2. RxJS 流管理:若拦截器中手动创建 Observable,需确保正确订阅(避免内存泄漏);
  3. 依赖注入:全局拦截器通过 APP_INTERCEPTOR 注册才能支持依赖注入;
  4. WebSocket/RPC 兼容:拦截器可用于非 HTTP 场景,需通过 switchToWs()/switchToRpc() 切换上下文;
  5. 异常处理:拦截器中捕获的异常若未重新抛出,会被视为正常响应,需注意 catchError 后是否 throwError。

总结

shell
1. 作用
   拦截器允许你在 controller 方法执行前后添加额外的逻辑,常用于捕获并转化异常或者处理 response 数据格式
2. 调用时机
   客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:
   日志记录、响应 response 数据映射、缓存、请求超时处理、性能监控、请求|响应转换、错误处理、权限预处理
4. 特点
   拦截器基于 AOP(面向切面编程)概念,非常适合处理横切关注点
5. 创建命令
   nest g interceptor logger
6. 应用级别(执行顺序:全局 > 控制器 >>
   全局级拦截器
   控制器级拦截器
   方法级拦截器