Interceptor 是 NestJS 最像“机场中转调度带”的能力之一。
官方文档总结得很准:它可以做
- 前后置逻辑
- 返回值转换
- 异常转换
- 缓存
- 覆写处理流程
一个经典例子:统一返回格式。
import {
CallHandler,
ExecutionContext,
Injectable,
NestInterceptor,
} from '@nestjs/common';
import { map, Observable } from 'rxjs';
@Injectable()
export class ResponseInterceptor<T>
implements NestInterceptor<T, { data: T }>
{
intercept(
_context: ExecutionContext,
next: CallHandler,
): Observable<{ data: T }> {
return next.handle().pipe(map(data => ({ data })));
}
}全局注册:
app.useGlobalInterceptors(new ResponseInterceptor());结果从:
{
"id": "f1",
"code": "MU2451"
}变成:
{
"data": {
"id": "f1",
"code": "MU2451"
}
}类比:
请求进站
↓
Guard 安检
↓
Pipe 预处理
↓
Controller / Service
↓
Interceptor 对结果统一包装
↓
返回Interceptor 很适合做:
- 响应包裹
- 耗时统计
- 缓存命中
- 审计日志
- 敏感字段裁剪
它不适合做:
- 认证主逻辑
- 核心领域规则
- 杂糅一切的“万能中间层”