NestJS 的 中间件 学习

基本概念

中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求响应对象。在程序中我们可以让多个中间件串起来一起使用,当多个中间件一起使用时我们可以使用next()调用下一个中间件。

中间件主要是可以实现如下功能:

  • 执行任何代码
  • 更改请求和响应对象
  • 结束请求-响应周期
  • 调用堆栈中的下一个中间件函数
  • 如果当前的中间件函数没有结束请求-响应周期,则必须调用 next()将控制权传递给下一个中间件函数。否则,请求将被挂起

在 NestJS 中可以在函数或者带有@Injectable()装饰器装饰的类来定义中间件,并且使用类时我们必须实现NestMiddleware接口,函数不需要做特殊处理。

依赖注入

在 NestJs 中中间件可以使用依赖注入的方式进行注入使用,就像控制器和提供者一样进行注入。

需要使用的时候,我们可以通过constructor进行实例化,然后进行使用。

在模块中使用中间件

@Module装饰器装饰的类中,我们是没有地方进行注入的,我们只能在类中使用configure()来声明使用中间件,并且类还必须集成NestModule接口。

接下来我们声明一个日志中间件,主要是简单的把请求对象和响应对象打印一下,具体代码如下:

// 日志中间件
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";@Injectable()
export class LoggerMiddleware implements NestMiddleware {use(req: Request, res: Response, next: NextFunction) {console.log("-------");console.log(req);console.log(res);console.log("-------");next();}
}
// App模块
@Module({imports: [CommodityModule, AccountModule],
})
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(LoggerMiddleware).forRoutes("commodity");}
}

在上面这里例子中,我们的中间件主要是针对带有commodity前缀的所有请求路径进行处理,并且注入的中间件为LoggerMiddleware

我们还可以在forRoutes传入参数对象,从而过滤出符合的请求进入到中间件中进行处理。例如我们限定监听请求路径是commodity并且是POST的请求:

configure(consumer: MiddlewareConsumer) {consumer.apply(LoggerMiddleware).forRoutes({ path: 'commodity', method: RequestMethod.POST });
}

forRoutes 的路由通配符

在上述的例子中,我们在forRoutes中传入路由参数后筛选出匹配的路由地址,其中path是匹配的路由地址,我们可以使用通配符来定义匹配的路由,而通配符设置规则已经在NestJS 的 Controller 学习文章中介绍过。

中间件消费者(MiddlewareConsumer 类)

MiddlewareConsumer是一个辅助类,它提供了几种内置方法来管理中间件。

forRoutes()方法传入的参数可以是字符串、多个字符串、RouterInfo 对象和控制器类,建议使用控制器类来作为forRoutes的参数,因为使用控制器类后,我们不需要过多的来维护监听的数据,这样维护效率会比较高并且清晰。

排除路线

有些时候我们希望排除某些路由应用中间件的时候,我们可以使用exclude()方法来排除某些路由。该方法传入的参数可以是字符串、多个字符串和 RouterInfo。具体的例子如下:

configure(consumer: MiddlewareConsumer) {consumer.apply(LoggerMiddleware).exclude('account/(.*)').forRoutes(CommodityController, AccountController);
}

函数中间件

当我们的中间件不需要任何成员、方法和依赖项的时候,可以使用函数中间件来替代类中间件。函数中间件的例子我们还是采用日志中间件为例,具体的例子如下:

export function MyLogger(req: Request, res: Response, next: NextFunction) {console.log("-------");console.log(req);console.log(res);console.log("-------");next();
}

全局中间件

全局中间件可以在main.ts文件中进行定义使用,具体如下:

const app = await NestFactory.create(AppModule);
app.use(logger);
await app.listen(3000);

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

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

相关文章

CentOS7.9.离线安装Docker

CentOS 7上离线安装Docker 下载适用于CentOS 7的Docker安装包: https://download.docker.com/linux/static/stable/x86_64/将下载的 docker-24.0.4.tgz 文件上传到CentOS 7系统。例如,可以上传到 /root 目录下。 解压 docker-24.0.4.tgz 文件&#xff…

搭建关键字驱动自动化测试框架

前言 上篇文章我们已经了解到了数据驱动自动化测试框架是如何构建和驱动测试的!那么这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试…

Windows10 下 Neo4j1.5.8 安装教程

前言 Neo4j 是一个高性能的、NOSQL 图形数据库,它将结构化数据存储在网络上而不是表中。基于磁盘的、具备完全的事务特性的 Java 持久化引擎,这里就不把他和常用关系型数据库做对比了。因为篇幅有限,我这里也是第一次使用,所以以…

elasticsearch报错问题

标题1.报错问题 标题2.新建一个配置类 package cn.itcast.hotel.config;import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import o…

【Linux】Tcp协议的通讯流程,浅谈三次握手四次挥手

文章目录 Tcp协议的通讯流程一、协议定制与网络版计算器的实现二、json的使用总结 Tcp协议的通讯流程 上一篇文章我们讲解了如何实现Tcp服务器,Tcp的接口也用了,下面我们就看一下Tcp协议的通讯流程: 在服务端,我们首先要创建一个…

电脑C盘空间大小调整 --- 扩容(扩大/缩小)--磁盘分区大小调整/移动

概述: 此方法适合C盘右边没有可分配空间(空闲空间)的情况,D盘有数据不方便删除D盘分区的情况下,可以使用傲梅分区助手软件进行跨分区调整分区大小,不会损坏数据。反之可直接使用系统的磁盘管理工具进行调整…

Flutter学习—— Vscode创建项目

目录 一、Vscode创建项目 二、补充五种项目类型 Application: Module 模块开发, Package开发 Plugin 插件开发 Skeleton 骨架开发 一、Vscode创建项目 1.快捷键 CtrlShiftP 打开命令面板,选择新项目 2.选择需要开发的项目类型 Application 应用开…

39岁硕士找工作因年龄被卡?招聘单位否认

年龄限制问题在求职市场中是一个备受关注的话题。 近日,一位39岁的硕士徐先生在求职过程中遇到了年龄限制的问题,这一经历引发了人们对于年龄限制的探讨。 我们先来明确一下年龄限制的含义。 年龄限制是指在一些职业或领域中,对于应聘者的年龄…

Python代码片段之Django静态文件URL的配置

首先要说明这段python代码并不完整,而且我也没有做过测试,只是我在工作时参考了其中的一些个方法。这是我在找python相关源码资料里看到的一段代码,是Django静态文件URL配置代码片段2,代码中有些方法还是挺技巧的,做其…

Tomcat 的使用(图文教学)

Tomcat 的使用(图文教学) 前言一、什么是Tomcat?二、Tomcat 服务器和 Servlet 版本的对应关系三、Tomcat 的使用1、安装2、目录介绍3、如何启动4、Tomcat 的停止5、如何修改 Tomcat 的端口号6、如何部暑 web 工程到 Tomcat 中6.1 方式一6.2 …

红队打靶:Nullbyte打靶思路详解(vulnhub)

目录 写在开头 第一步:主机发现与端口扫描 第二步:Web渗透 第三步:hydra密码爆破 第四步:SQL注入大赏 方法一:手工SQL注入之联合查询 方法二:SQL注入写入一句话木马 方法三:SQL注入写入…

C语言学习笔记 VScode设置C环境-06

目录 一、下载vscode软件 二、安装minGW软件 三、VS Code安装C/C插件 3.1 搜索并安装C/C插件 3.2 配置C/C环境 总结 一、下载vscode软件 在官网上下载最新的版本 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 二、安装minGW…

测试覆盖率 JVM 字节码测试运用 - 远程调试、测试覆盖、影子数据库

目录 前言: 简介 基础使用方式介绍 工具特性 前言: 在软件开发中,测试覆盖率是一个非常重要的指标,它表示代码中所有的测试用例是否都已经被覆盖到。JVM 字节码测试是一种比较新的测试方法,它可以对 JVM 字节码进…

托管和非托管 Kubernetes 管理平台详解(第一部分)

托管和非托管 Kubernetes 管理平台分别有哪些优势和不足?我们将通过两篇文章进行详细介绍,帮助您选择更适合自身需求的平台。 首先,让我们了解一下托管的 Kubernetes 管理平台(KMP)。 托管的 KMP 托管 Kubernetes 管…

FFMPEG源码之ffmpeg.c解析

重要函数解析 main()ffmpeg_parse_options()transcode() main() int main(int argc, char **argv) {int ret;BenchmarkTimeStamps ti;/* 初始化动态加载 */init_dynload();/* 注册退出回调函数 */register_exit(ffmpeg_cleanup);/* 设置stderr的缓冲模式(win32运行…

【运动规划算法项目实战】TABV代码解析(五):plan_manage

文章目录 前言一、FastPlannerManager.h1.1 成员变量:二、KinoReplanFSM.h2.1 成员变量2.2 方法三、plan_container.hpp3.1 成员变量:3.2 实现方法:四、backward.hpp五、fast_planner_node.cpp六、kino_replan_fsm.cpp七、planner_manager.cpp八、traj_server.cpp九、总结前言…

nlp系列(6)文本实体识别(Bi-LSTM+CRF)pytorch

模型介绍 LSTM:长短期记忆网络(Long-short-term-memory),能够记住长句子的前后信息,解决了RNN的问题(时间间隔较大时,网络对前面的信息会遗忘,从而出现梯度消失问题,会形成长期依赖…

Elasticsearch 一段时间后出现 SocketTimeoutException的问题

java springboot 使用ES客户端连接 一段时间闲置后,首次调用es命令会报SocketTimeOutException问题,再次调用不会报错 问题出现原因: Elasticsearch 客户端会根据服务器返回的HTTP报文内容,来决定客户端保持HTTP连接Keep-Alive…

开源项目注意事项

fork项目后,记得另外开启一个分支然后在新分支上进行开发,push到仓库后从分支往原项目提交。 否则会出现Partially verified(导致提交pr后auto-merge失败) 注意git提交操作 https://blog.csdn.net/sonichenn/article/details/13…

flask中的werkzeug介绍

flask中的werkzeug Werkzeug是一个Python库,用于开发Web应用程序。它是一个WSGI(Web Server Gateway Interface)工具包,提供了一系列实用功能来帮助开发者处理HTTP请求、响应、URLs等等。Werkzeug的设计非常灵活,可以…