【Nest教程】自定义拦截器处理处理响应数据

举报
青年码农 发表于 2022/08/25 00:24:30 2022/08/25
【摘要】 拦截器(Interceptors)是一个使用 @Injectable() 装饰的类,它必须实现 NestInterceptor 接口。 前面讲了基于Nest生成Web API项目,如果不清楚请移步:【Nest教程】基于Nest初始化Web API项目,文章只讲解了使用脚手架搭建简单的项目并且可以正常运行。 今天我们讲...

拦截器(Interceptors)是一个使用 @Injectable() 装饰的类,它必须实现 NestInterceptor 接口。

前面讲了基于Nest生成Web API项目,如果不清楚请移步:【Nest教程】基于Nest初始化Web API项目,文章只讲解了使用脚手架搭建简单的项目并且可以正常运行。

今天我们讲下自定义拦截器,Nest拦截器功能很强大,可以在函数执行之前/之后绑定额外的逻辑、转换从函数返回的结果、转换从函数抛出的异常、扩展基本函数行为等。我们在之前的项目基础上增加自定义拦截器,转换从函数返回的结果。

1 创建自定义拦截器

我们在我们项目目录src下新建interceptor文件夹,文件夹下新建transform.interceptor.ts文件,文件内容如下:


   
  1. import {
  2.     Injectable,
  3.     NestInterceptor,
  4.     CallHandler,
  5.     ExecutionContext,
  6.   } from '@nestjs/common';
  7.   import { map } from 'rxjs/operators';
  8.   import { Observable } from 'rxjs';
  9.   interface Response<T> {
  10.     data: T;
  11.   }
  12.   @Injectable()
  13.   export class TransformInterceptor<T>
  14.     implements NestInterceptor<T, Response<T>> {
  15.     intercept(
  16.       context: ExecutionContext,
  17.       next: CallHandler<T>,
  18.     ): Observable<Response<T>> {
  19.       return next.handle().pipe(
  20.         map(data => {
  21.           return {
  22.             data,
  23.             code: 0,
  24.             message: '请求成功',
  25.           };
  26.         }),
  27.       );
  28.     }
  29.   }

注意:用到了rxjs模块,需要先安装

yarn add rxjs
  
  • 每个拦截器都有intercept(ExecutionContext, CallHandler)方法,第一个参数是执行上下文,第二个参数是调用处理程序

  • CallHandler是一个包装执行流的对象。因此。必须手动调用hander()方法,最终方法才会被触发

  • handle()返回一个Observable,这里我们拦截响应数据,给相应数据外面套一层对象。

2 项目绑定自定义拦截器

绑定拦截器也是比较简单,我们在项目src目录下,main.ts文件导入我们新建的文件,绑定即可


   
  1. import { NestFactory } from '@nestjs/core';
  2. import { AppModule } from './app.module';
  3. import { TransformInterceptor } from './interceptor/transform.interceptor';
  4. async function bootstrap() {
  5.   const app = await NestFactory.create(AppModule);
  6.   app.useGlobalInterceptors(new TransformInterceptor());
  7.   await app.listen(3000);
  8. }
  9. bootstrap();

3 启动项目查看效果

启动项目

yarn start
  

用postman get请求方式请求

dacd7a6b4aa3a7eb6060908993f4df7a.png

我们可以看到,最外层是我们自定义的,data里是响应数据。文章里没有过多的讲解理论知识,因为我也是刚开始学习Nest,只能是需要什么就查什么,记录什么。如果你也是对这个比较感兴趣,我们可以共同交流学习。

文章来源: blog.csdn.net,作者:NMGWAP,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/NMGWAP/article/details/125066671

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。