NestJS 拦截器
拦截器是用 @Injectable() 装饰器注释并实现 NestInterceptor 接口的类。基于 AOP(面向切面编程)思想设计,能够拦截请求 / 响应生命周期、修改数据流、绑定额外逻辑(如日志、缓存、异常处理),并支持异步操作和流式处理。
生命周期位置
排第四位,分为前置和后置
进入控制器的请求(前置处理)
控制器返回的响应(后置处理)
shell
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应核心特性
- 切面编程:分离核心业务与横切逻辑(日志、缓存、鉴权);
- 异步支持:基于 RxJS 流处理异步操作(NestJS 底层依赖 RxJS);
- 灵活绑定:可绑定到控制器、特定路由、全局范围;
- 数据转换:修改请求参数、响应数据或异常格式;
- 执行控制:延迟执行、跳过处理器、重试逻辑等。
- 适合处理「请求 / 响应生命周期」相关的通用逻辑。
注意事项
- 性能考量:全局拦截器会作用于所有请求,避免在拦截器中执行重计算、慢查询;
- RxJS 流管理:若拦截器中手动创建 Observable,需确保正确订阅(避免内存泄漏);
- 依赖注入:全局拦截器通过 APP_INTERCEPTOR 注册才能支持依赖注入;
- WebSocket/RPC 兼容:拦截器可用于非 HTTP 场景,需通过 switchToWs()/switchToRpc() 切换上下文;
- 异常处理:拦截器中捕获的异常若未重新抛出,会被视为正常响应,需注意 catchError 后是否 throwError。
总结
shell
1. 作用
拦截器允许你在 controller 方法执行前后添加额外的逻辑,常用于捕获并转化异常或者处理 response 数据格式
2. 调用时机
客户端请求 --> 中间件 --> 守卫 --> 管道 --> 拦截器(前置) --> 控制器方法执行 --> 拦截器(后置) --> 异常过滤器 --> 返回响应
3. 使用场景:
日志记录、响应 response 数据映射、缓存、请求超时处理、性能监控、请求|响应转换、错误处理、权限预处理
4. 特点
拦截器基于 AOP(面向切面编程)概念,非常适合处理横切关注点
5. 创建命令
nest g interceptor logger
6. 应用级别(执行顺序:全局 > 控制器 > 方法> )
全局级拦截器
控制器级拦截器
方法级拦截器