拦截器包装路由处理程序的执行,让你可以在它之前和之后运行逻辑——并转换请求或响应。它们受到面向方面编程的启发,非常适合处理日志记录、响应转换、缓存和计时等跨越多个关注点的问题。
结构:通过 RxJS 实现 before + after
ts
()
{
(: , : ): <> {
.();
now = .();
next.().(
( .()),
);
}
}
拦截器实现 intercept()。next.handle() 之前的代码在处理程序之前运行;next.handle() 返回响应的 RxJS Observable,而 tap/map 等操作符让你可以在处理程序完成之后作用于响应。
@Injectable()
export class TransformInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler) {
return next.handle().pipe(
map(data => ({ success: true, data, timestamp: new Date().toISOString() })),
// wraps EVERY response in a consistent envelope: { success, data, timestamp }
);
}
}
使用 map,拦截器可以重新组织每个响应——例如将所有响应包装在标准包装中,这是统一 API 响应的一种非常常见的模式。
// caching — return a cached response, skipping the handler entirely
// timeout — fail requests taking too long
return next.handle().pipe(timeout(5000));
// error mapping — transform exceptions
return next.handle().pipe(catchError(err => throwError(() => new BadGatewayException())));
// excluding fields (serialization) — ClassSerializerInterceptor strips @Exclude() fields
Common interceptor uses:
✓ Logging / timing requests (before + after)
✓ Transforming responses (consistent envelopes, field exclusion)
✓ Caching responses
✓ Adding timeouts
✓ Mapping/handling errors
@UseInterceptors(LoggingInterceptor) // method or controller level
app.useGlobalInterceptors(new TransformInterceptor()); // global
Middleware → runs BEFORE everything, with raw req/res (can't easily touch the response)
Guard → AUTHORIZATION decision (allow/block) before the handler
Interceptor → wraps the handler — runs BEFORE and AFTER, can TRANSFORM the response
定义特性:拦截器可以在处理程序之后运行逻辑并转换响应——这是中间件和守卫无法正确做到的。
拦截器是 NestJS 的强大功能,用于优雅地处理跨越多个关注点的问题,其与众不同的能力——在处理程序前后运行逻辑,并转换响应——使其成为中间件和守卫无法解决的需求的正确工具。
理解它们很重要,因为许多常见的需求自然地映射到拦截器:一致的响应格式化(将所有响应包装在标准的 { success, data } 包装中)、日志记录/计时(测量处理程序持续时间)、缓存(返回缓存的响应)、超时、错误转换和序列化(排除敏感字段)。
了解结构(next.handle() Observable,使用 tap/map/catchError 在前后作用)、常见用例,特别是拦截器如何不同于中间件和守卫(包装和转换响应的能力)是 NestJS 架构能力的关键部分。
拦截器使跨越多个关注点的逻辑保持 DRY 且集中,而不是在处理程序中重复,使其成为构建简洁、可维护的 NestJS 应用程序的常用、重要工具。