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

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

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

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

1 创建自定义拦截器

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

import {
    Injectable,
    NestInterceptor,
    CallHandler,
    ExecutionContext,
  } from '@nestjs/common';
  import { map } from 'rxjs/operators';
  import { Observable } from 'rxjs';
  interface Response<T> {
    data: T;
  }
  @Injectable()
  export class TransformInterceptor<T>
    implements NestInterceptor<T, Response<T>> {
    intercept(
      context: ExecutionContext,
      next: CallHandler<T>,
    ): Observable<Response<T>> {
      return next.handle().pipe(
        map(data => {
          return {
            data,
            code: 0,
            message: '请求成功',
          };
        }),
      );
    }
  }

复制

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

yarn add rxjs

复制

  • 每个拦截器都有intercept(ExecutionContext, CallHandler)方法,第一个参数是执行上下文,第二个参数是调用处理程序
  • CallHandler是一个包装执行流的对象。因此。必须手动调用hander()方法,最终方法才会被触发
  • handle()返回一个Observable,这里我们拦截响应数据,给相应数据外面套一层对象。

2 项目绑定自定义拦截器

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

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { TransformInterceptor } from './interceptor/transform.interceptor';
async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalInterceptors(new TransformInterceptor());
  await app.listen(3000);
}
bootstrap();

复制

3 启动项目查看效果

启动项目

yarn start

复制

用postman get请求方式请求

image.png

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

相关文章
|
JavaScript
在vue3中使用markdown编辑器
在vue3中使用markdown编辑器
在vue3中使用markdown编辑器
Nest.js 实战 (一):使用过滤器优雅地统一处理响应体
这篇文章介绍了在Nest.js中如何处理接口统一返回格式的方法。首先定义了响应状态码枚举和类型,然后创建了HttpException异常过滤器来捕获HttpException类的异常并设置自定义响应逻辑。最后通过全局配置和效果预览展示了如何应用这些设置。
437 0
Nest.js 实战 (一):使用过滤器优雅地统一处理响应体
|
12月前
|
消息中间件 监控 物联网
MQTT协议对接及RabbitMQ的使用记录
通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
739 0
|
存储 SQL 运维
使用PowerShell进行自动化脚本编写:入门与实战
【6月更文挑战第6天】本文介绍了PowerShell作为Windows系统管理的自动化工具,用于提升效率和减少错误。内容涵盖PowerShell基础,如变量、命令执行、管道、条件和循环语句、函数。实战案例展示了如何用PowerShell脚本进行文件备份。此外,还提及PowerShell的进阶功能,如模块、远程管理和与其他工具集成。学习和应用PowerShell能有效提升IT运维自动化水平。
|
存储 Linux 测试技术
【Docker项目实战】使用Docker部署Raneto知识库平台
【2月更文挑战第11天】使用Docker部署Raneto知识库平台
348 2
【Docker项目实战】使用Docker部署Raneto知识库平台
|
IDE API 开发工具
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之LoadingProgress组件
鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之LoadingProgress组件
542 5
[Nestjs] 手摸手之简单封装API接口的返回结果
介绍:在 NestJs 中,你可以自定义一个统一的响应封装来支持成功、错误和分页响应。
456 0
vant-函数式组件用法
vant-函数式组件用法
194 0
|
前端开发 JavaScript
nuxt3:postcss-pxtorem
nuxt3:postcss-pxtorem
715 0
nuxt3:postcss-pxtorem
|
缓存
umi如何做一个路由的鉴权?
在wrappers文件夹创建一个index.tsx文件夹
471 0