推荐答案
Nest.js 拦截器是一种强大的机制,允许你在请求处理之前或之后执行额外的逻辑。拦截器可以用于多种场景,例如日志记录、错误处理、缓存、请求/响应转换等。它们通过实现 NestInterceptor
接口来定义,并使用 @Injectable()
装饰器标记为可注入的服务。
拦截器的核心方法是 intercept
,它接收两个参数:ExecutionContext
和 CallHandler
。ExecutionContext
提供了当前请求的上下文信息,而 CallHandler
是一个包装了路由处理程序的流,允许你在请求处理前后插入逻辑。
本题详细解读
拦截器的基本结构
一个典型的拦截器结构如下:
-- -------------------- ---- ------- ------ - ----------- ---------------- ----------------- ----------- - ---- ----------------- ------ - ---------- - ---- ------- ------ - --- - ---- ----------------- ------------- ------ ----- ------------------ ---------- --------------- - ------------------ ----------------- ----- ------------- --------------- - ------------------------- ----- --- - ----------- ------ ---- --------- ------ ------ -- --------------------- ------------ - ---------- -- - -
在这个例子中,LoggingInterceptor
拦截器在请求处理前后分别打印日志。next.handle()
调用实际的请求处理程序,并返回一个 Observable
,你可以在其上使用 RxJS 操作符来添加额外的逻辑。
拦截器的执行顺序
拦截器的执行顺序与它们在控制器或路由上的绑定顺序一致。例如:
@UseInterceptors(LoggingInterceptor) @Controller('cats') export class CatsController { @Get() findAll(): string { return 'This action returns all cats'; } }
在这个例子中,LoggingInterceptor
会在 findAll
方法执行前后分别打印日志。
拦截器的应用场景
- 日志记录:在请求处理前后记录日志,便于调试和监控。
- 错误处理:捕获并处理请求处理过程中抛出的异常。
- 缓存:在请求处理前检查缓存,如果命中则直接返回缓存结果。
- 请求/响应转换:在请求处理前后对请求或响应数据进行转换或验证。
拦截器与中间件的区别
虽然拦截器和中间件都可以在请求处理前后执行逻辑,但它们的作用范围和能力有所不同。中间件更偏向于处理 HTTP 请求的底层细节,而拦截器则更专注于业务逻辑的处理,并且可以与 Nest.js 的依赖注入系统无缝集成。
总结
Nest.js 拦截器提供了一种灵活的方式来增强请求处理流程,允许你在请求处理前后插入自定义逻辑。通过实现 NestInterceptor
接口并使用 @Injectable()
装饰器,你可以轻松创建和使用拦截器来处理各种场景。