拦截器介绍
在NestJS中,拦截器是一种强大的工具,用于在 HTTP 请求和响应的处理过程中插入自定义的逻辑。它们的作用就像是对整个请求-响应管道的一种控制器,允许您在处理请求或响应的不同阶段执行额外的任务。
通俗地说,NestJS拦截器就像是一位自动化的管家,可以在整个请求-响应过程中为您执行一些特定的任务。以下是一些通俗的描述:
- 请求拦截器:
就像在餐厅点餐前,有个人会在你的请求前检查是否有会员卡、是否已登录等。在NestJS中,请求拦截器可以在处理请求之前执行一些任务,比如身份验证、请求日志记录等。 - 响应拦截器:
就像在餐厅享用美食后,有个人会在你收到菜品前检查是否需要添加额外的调味品。在NestJS中,响应拦截器可以在处理响应之前执行一些任务,如处理错误、格式化响应数据等。 - 异常拦截器:
就像在餐厅享受美食时,如果出现了不愉快的情况,有个人会负责解决问题。在NestJS中,异常拦截器用于在请求或响应处理过程中捕获和处理异常情况,使得应用程序能够更优雅地处理错误。
拦截器封装
import {
Injectable,
NestInterceptor,
CallHandler,
ExecutionContext,
} from '@nestjs/common';
import { Observable, map } from 'rxjs';
interface Data<T> {
data: T;
code: number;
msg: string;
}
export class ResponseInterceptor<T> implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<Data<T>> {
return next
.handle()
.pipe(
map(({ data, msg = '请求成功', code = 200 }) => ({ code, msg, data })),
);
}
}
@Injectable()
装饰器将类标记为可被NestJS框架注入的服务。
ResponseInterceptor<T>
类实现了 NestInterceptor 接口。
intercept
方法是拦截器的核心,它接收 ExecutionContext 和 CallHandler,并返回一个 Observable<Data>。
next.handle()
调用了处理链中的下一个处理程序,即继续执行后续的拦截器或路由处理程序。
pipe(map(...))
部分使用RxJS中的map操作符,将原始的响应数据进行转换,确保最终响应数据的结构符合定义的Data接口。
拦截器使用
import { Controller, Get, UseInterceptors } from '@nestjs/common';
import { ResponseInterceptor } from './response.interceotor';
@Controller('test')
@UseInterceptors(ResponseInterceptor)
export class TestController {
@Get()
async getData() {
return {
data:'test',
code:200,
msg:'测试'
}
}
}
另一种方式为全局拦截,在main.ts
中注册
app.useGlobalInterceptors(new ResponseInterceptor());