一篇文章学会 NestJS 的拦截器并且附带实战操作案例

前言

在现代Web开发的世界中,NestJS以其灵活性和强大的功能立足,成为Node.js框架的佼佼者。其中一个引人注目的功能就是拦截器,这是一种可以让开发者更好地控制和补充HTTP请求循环的工具。拦截器让开发者可以在处理程序之前或之后“拦截”HTTP请求,这是解决一系列问题的基石。

什么是NestJS拦截器

简单来说,拦截器是一种特殊类型的服务,运行在路由处理程序方法之前和之后。它们在每次请求和响应的生命周期中都被调用,能够在请求处理之前进行操作,或对从处理程序返回的响应进行转换。

你可以将其视为中间件的一种更先进的形式,它们在每次请求和响应的生命周期中都被运行。

NestJS拦截器的用途

NestJS拦截器的常见用途包括:

1. 修改响应数据

统一所有响应数据的格式,为其添加相同的结构或者字段。

2. 请求预处理

实现认证和授权逻辑,或对请求数据进行初步校验。

3. 性能调优

计算处理请求所需的时间,为优化性能提供依据。

4. 日志记录

记录每次请求及响应的详细数据,为问题排查提供信息。

实际案例

下面,我们将通过一些具体的案例来了解如何在实际项目中使用NestJS拦截器。

1. 响应数据的统一处理

在这个案例中,我们希望所有的HTTP响应都有一个 code字段和 data字段。我们可以通过创建一个拦截器来执行此操作:

import { 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 })),);}
}

这是执行后的结果:

{"code": 200,"data": {/* 原来的响应数据 */}
}

2. 记录处理时间

此拦截器可用于记录处理请求所需的时间,对于性能优化非常有用:

import { 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`)),);}
}

执行的结果可能如下:

After... 27ms

总结

以上就是对NestJS拦截器的详细介理解和使用案例。掌握了拦截器,我们可以在处理请求时有更多的操作空间。虽然这只是NestJS的众多特性之一,但其强大的潜力表明了它在构建现代Web应用程序时的价值。

使用NestJS开发应用程序是一种愉快的体验,而拦截器无疑大大增强了它的功能,使我们可以更好地控制和管理HTTP请求。这只是NestJS的一小部分,但却能大大提升你的开发效率。

此外,此处提供的使用案例只是冰山一角,实际上,NestJS拦截器的可能性几乎是无限的,可以根据不同的需求定制拦截器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++/c对应内存分区

栈区 1. 用于存放,局部变量,函数的参数。 2. 内部存放的变量生命周期: 从定义开始到函数结束。所以局部变量和参数只能在函数自己本身使用。 3. 作用域: 只能在定义的函数中使用。 堆区 1. 堆区内存,是用来动态分配内存的,程序员可以根据情况自己申请内存。 2. 生命周…

基于vue2+elementUI年份范围选择器

基于vue2elementUI实现年份范围选择器&#xff0c;支持时间跨度设置。代码如下&#xff1a; <template><el-popoverref"popover"placement"bottom"v-model"showPanel"popper-class"custom_year_range"trigger"manual&q…

【C/C++笔试练习】sort排序、STL容器、vector的特性、一级容器、迭代器失效、异常捕获、动态转换、统计每个月兔子的总数、字符串通配符

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;sort是不稳定排序&#xff08;2&#xff09;存放即有序的STL容器&#xff08;3&#xff09;连续储存的STL容器&#xff08;4&#xff09;vector的特性&#xff08;5&#xff09;一级容器&#xff08;6&#xff09;unorde…

PLC-IoT 网关开发札记(1):存档和分发 Android App

开篇记 PLC-IoT 网关是作者开发的产品&#xff0c;根据客户需求&#xff0c;立项开发手机 App&#xff0c;为用户提供一种方便、直观、友好的设备操控方式。网关运行的是嵌入式 Linux 操作系统&#xff0c;计划通过某一种通信协议&#xff08;例如 HTTP&#xff0c;MQTT或者 T…

大数定律中心极限定理

1.切比雪夫不等式 切比雪夫不等式可以对随机变量偏离期望值的概率做出估计&#xff0c;这是大数定律的推理基础。以下介绍一个对切比雪夫不等式的直观证明。 1.1 示性函数 对于随机事件A&#xff0c;我们引入一个示性函数 I A { 1 , A发生 0 , A不发生 I_A\begin{cases} 1&…

Chrome浏览器进程工作原理和机制

Chrome浏览器进程工作原理和机制 Chrome架构&#xff1a;一个页面四个进程进程和线程单进程浏览器多进程浏览器多进程浏览器解决的问题Chrome的进程模式 TCP协议&#xff1a;如何保证页面文件被完整送达浏览器IP&#xff1a;把数据包送达目的主机UDP&#xff1a;把数据包送达应…

vivado CDC约束-约束总线偏移

CDC限制 关于CDC约束 时钟域交叉&#xff08;CDC&#xff09;约束适用于具有不同启动和捕获时钟。根据发布和捕获时钟关系以及在CDC路径上设置的定时异常。例如同步时钟之间但被错误路径约束覆盖的CDC路径不定时&#xff0c;并且因此被视为异步CDN。异步CDC路径可以是安全的&…

vue 导出 HTML 结构为 Word 文档(.docx)-支持表格、css样式、图片

在 Web 开发中&#xff0c;有时我们希望用户能够将网页上的 HTML 内容保存为 Word 文档&#xff0c;以便更方便地分享和打印。本文将介绍如何使用 html-docx-js 和 file-saver 这两个 JavaScript 库&#xff0c;实现将 HTML 结构导出为 Word 文档的功能。 工具简介 1. html-d…

lv13 内核模块参数和依赖

1 模块传参 1.1 模块参数设置 将指定的全局变量设置成模块参数 module_param(name,type,perm);//将指定的全局变量设置成模块参数 /* name:全局变量名 type&#xff1a;使用符号 实际类型 传参方式bool bool insmod xxx.ko 变量名0 …

进阶学习——Linux系统磁盘管理与文件系统

目录 一、磁盘 1.认识磁盘 2.分区 2.1MBR&#xff08;Master Boot Record&#xff09;——主引导记录 2.2GPT分区 2.3磁盘分区结构 3.文件系统 3.1文件系统组成 3.1.1XFS ext4 3.1.2swap 3.1.3FAT16、FAT32 3.1.4NTFS&#xff08;xfs&#xff09; 3.1.5EXT4 3…

[Angular] 笔记 9:list/detail 页面以及@Output

1. Output input 好比重力&#xff0c;向下传递数据&#xff0c;list 传给 detail&#xff0c;smart 组件传给 dumb 组件&#xff0c;父组件传给子组件。input 顾名思义&#xff0c;输入数据给组件。 output 与之相反&#xff0c;好比火箭&#xff0c;向上传递数据或事件。ou…

vue3 v-model语法糖

vue2 中父子组件数据同步 父→子 子→父 如何实现&#xff1f; v-model“count” 或者 xxx.sync“msg” v-model 语法糖 完整写法 :value“count” 和 input“count$event” xxx.sync 语法糖 完整写法 :xxx“msg” 和 update:xxx“msg$event” 现在&#xff1a;一个 v-mo…

云计算IaaS、PaaS和SaaS之

提供的服务来比较如下两图 示例图 示例图

整数规划-割平面法

整数规划-割平面法 割平面法思想Gomorys割平面法原理实例 谨以此博客作为学习期间的记录。 割平面法思想 在之前&#xff0c;梳理了分支定界法的流程:分支定界法 除了分支定界法&#xff0c;割平面法也是求解整数规划的另一个利器。 我们已经知道&#xff0c;线性规划的可行域…

vscode软件安装步骤

目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址&#xff0c;找到下载界面 链接如下&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑&#xff0c;各位小伙伴自己选择合适的版本&#xff0c;点击下载按钮…

从数据洞察到市场变革:我们的 Web3 愿景

shellyfootprint.network 2023 年&#xff0c;我们见证了加密市场的潮起潮落&#xff0c;在这个不断变化的世界中&#xff0c;我们始终坚守着创新的信念&#xff0c;致力于打造强大的数据分析工具。 我们深知&#xff0c;开拓创新是推动 Web3 发展的关键。因此&#xff0c;我…

基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战

简介 特点 是一款操作系统,跟windows,macos一样,有下面的特点 简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置 权限高,把所有细节都交给用户,可完全自定义 安全,所有程序只有自己执行才会启动 分类 1、debian系主要有Debian&#xff0c;Ubun…

ESP32入门六(读取引脚的模拟信号[3]:信号出现误差的原因[硬件篇])

在之前的文章中&#xff0c;我们介绍了ESP32在读取模拟信号时出现的误差的软件方面原因&#xff0c;在这一篇中&#xff0c;将会介绍并测试由于硬件或其它方面导致数据出现误差的原因。 一、厂商原因 首先&#xff0c;我们需要知道&#xff0c;在每块EPS32中&#xff0c;在出…

海凌科HLK-V2语音识别模块更新词条

简介 HLK-V20 是海凌科的离线语音识别模块, 中英文不同时支持, 只支持中文/英文, 具体识别看每次的SDK更新设置;资料下载 可以在微信公众包搜索海凌科或HI-LINK, 下载资料 感知模块->HLK-V20 模块限制 中英文被限制, 需要根据你在官网设置的SDK信息进行确定;可以仅设置3…

goframe v2 模板引擎的用法

这里用的goframe v2框架 提醒&#xff1a;下面的import 引入的控制器和api&#xff0c;根据自己实际项目路径 main函数 import ("context""github.com/gogf/gf/v2/net/ghttp""github.com/gzdzh/dzhgo/modules/dzhCms/controller/web""gith…