一篇文章学会 NestJS 的拦截器并且附带实战操作案例
前言
在现代Web开发的世界中,NestJS以其灵活性和强大的功能立足,成为Node.js框架的佼佼者。其中一个引人注目的功能就是 拦截器 ,这是一种可以让开发者更好地控制和补充HTTP请求循环的工具。拦截器让开发者可以在处理程序之前或之后“拦截”HTTP请求,这是解决一系列问题的基石。
什么是NestJS拦截器
简单来说,拦截器是一种特殊类型的服务,运行在路由处理程序方法之前和之后。它们在每次请求和响应的生命周期中都被调用,能够在请求处理之前进行操作,或对从处理程序返回的响应进行转换。
你可以将其视为中间件的一种更先进的形式,它们在每次请求和响应的生命周期中都被运行。
NestJS拦截器的用途
NestJS拦截器的常见用途包括:
1. 修改响应数据
统一所有响应数据的格式,为其添加相同的结构或者字段。
2. 请求预处理
实现认证和授权逻辑,或对请求数据进行初步校验。
3. 性能调优
计算处理请求所需的时间,为优化性能提供依据。
4. 日志记录
记录每次请求及响应的详细数据,为问题排查提供信息。
下面,我们将通过一些具体的案例来了解如何在实际项目中使用NestJS拦截器。
1. 响应数据的统一处理
在这个案例中,我们希望所有的HTTP响应都有一个
code
字段和
data
字段。我们可以通过创建一个拦截器来执行此操作:
typescriptimport { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @Injectable() export class TransformInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { return next .handle() .pipe( map(data => ({ code: 200, data })),
这是执行后的结果:
json{ "code": 200, "data": {/* 原来的响应数据 */}
2. 记录处理时间
此拦截器可用于记录处理请求所需的时间,对于性能优化非常有用:
typescriptimport { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @Injectable() export class TimingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable<any> { const now = Date.now(); return next .handle() .pipe( tap(() => console.log(`After... ${Date.now() - now}ms`)),
执行的结果可能如下: