第十三章 Nest Middleware

在上一章我们了解到Nest 并不直接依赖Express 可以切换到别的http 请求处理库

创建项目:

nest new middleware-test -p npm

1718443871839.png
创建 middleware :

nest g middleware test --no-spec --flat

1718444161226.png
1718444185303.png
这时候可以看到 req 和 res 的类型都是为 any类型 所以并不知道使用的是express 还是 fastify,所以我们需要手动标注一下类型:
下面是express 的类型标注:

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';@Injectable()
export class TestMiddleware implements NestMiddleware {use(req: Request, res: Response, next: () => void) {console.log('进入 TestMiddleware');next();console.log('结束 TestMiddleware');}
}

接着在 app.module.ts 使用:

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TestMiddleware } from './test.middleware';@Module({imports: [],controllers: [AppController],providers: [AppService],
})
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(TestMiddleware).forRoutes('*')}
}

这样调用接口的时候就会使用到TestMiddleware 。
接着我们浏览器访问 http://localhost:3000
1718885548154.png
1718885563647.png
当然我们也可以指定一些路由用到Middleware,
修改app.controller.ts,增加 test test2 接口

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(): string {return this.appService.getHello();}@Get('test')getTest(): string {return 'test';}@Get('test2')getTest2(): string {return 'test2';}
}

修改 app.module.ts ,下面代码设置了只有 http://localhost:3000/ http://localhost:3000/test 才会使用到TestMiddleware中间件

import { MiddlewareConsumer, Module, NestModule, RequestMethod } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TestMiddleware } from './test.middleware';@Module({imports: [],controllers: [AppController],providers: [AppService],
})
export class AppModule implements NestModule {configure(consumer: MiddlewareConsumer) {consumer.apply(TestMiddleware).forRoutes({ path: '', method: RequestMethod.GET })consumer.apply(TestMiddleware).forRoutes({ path: 'test', method: RequestMethod.GET })}
}

最后修改test.middleware.ts:

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';@Injectable()
export class TestMiddleware implements NestMiddleware {use(req: Request, res: Response, next: () => void) {console.log('进入 TestMiddleware');console.log('接口', req.url);next();console.log('结束 TestMiddleware');}
}

我们依次访问 http://localhost:3000/ http://localhost:3000/test http://localhost:3000/test2
接着回到控制台可以发现:
1718886256417.png
可以看到只有 / /test 这两个接口才调用到Middleware中间件 以上就是 Nest 里 middleware 的用法

1719034104514.png
可以看到上面图片 Middleware 是通过class实现的,使用class实现可以让我们进行依赖注入,例如
通过 @Inject 注入 AppService 到 middleware:
test.middleware.ts:

import { Inject, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import { AppService } from './app.service';@Injectable()
export class TestMiddleware implements NestMiddleware {@Inject(AppService)private readonly appService: AppService;use(req: Request, res: Response, next: () => void) {console.log('进入 TestMiddleware');console.log('接口', req.url);console.log('调用了service', this.appService.getHello());next();console.log('结束 TestMiddleware');}
}

接着我们访问需要知道到中间件的接口 例如 http://localhost:3000/
1719034977234.png
可以看到 我们调用了service,这就是 Nest 注入的依赖。

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

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

相关文章

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void p…

centos7 安装redis

在 CentOS 7 上配置 Redis 5 的步骤如下: 1. 安装依赖 Redis 是由 C 语言开发的,因此在安装之前需要确保服务器已经安装了 gcc。你可以通过以下命令查看是否已经安装: gcc -v 如果没有安装,可以通过以下命令安装: yu…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库:CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句(如给用户li创建一个学生管理模式“S-T”)(需要先添加一个用户li) 3、在数据库ecommerce1中…

7月4号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT总线使用

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一,结合丰富的运动控制功能、实时数据采集、处理和本地计算等,具备高度灵活的可编程性和出色的运动控制性能,为运动控制协同工业互联网应用带来巨大市场潜力,同时也使其成为企…

【必会面试题】快照读、当前读是什么?如何理解

目录 1. 当前读(Current Read)2.快照读(Snapshot Read)3.总结流程图 快照读和当前读是MySQL数据库的重要机制,也是高频的面试题。首先我们要知道以下几个概念。 缓存机制:缓存是系统中用于存储经常访问的数据的内存空间…

中英双语介绍美国的州:北达科他州(North Dakota)

中文版 北达科他州简介 北达科他州(North Dakota)位于美国中西部的北部,以其广袤的草原、丰富的农业资源和石油产业而闻名。以下是对北达科他州的详细介绍,包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 北达…

ID3算法决策树

步骤: 先计算出信息量;信息熵;信息增量; 再比较信息增量的大小,确定分类依据。 信息量: 信息熵: 信息增益:

Android View滑动冲突解决方案

文章目录 前言1. 滑动冲突2. 解决方案2.1 外部解决法2.2 内部拦截法 参考资料 前言 本文需要读者对View事件分发的流程有基本的了解,如果还未完全理解事件分发流程的,需要先学习相关部分内容,这部分可以参考我的上一个博客: And…

Postman使用教程

传统接口风格 RESTful风格 使用Postman完成测试用例目标: Postman教程 (1)准备工作,下载Postman新建 (2)登录接口调试-获取验证码 (3)登录接口调试-登录 (4)…

线程的联合

当前线程邀请调用方法的线程优先执行,在调用方法的线程执行结束之前,当前线程不能再次执行。线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继…

Mysql查询IFNULL和想象的不一样

select sum(ifnull(a,0)) aaa,ifnull(sum(a),0) bbb from (select g.goodsid a from goods g where g.goodsid 601 ) tmp #注意 goodsid 601 的不存在 ​​​ 返回的结果和想象中不同,解释如下 在您SQL查询中,创建了一个子查询(别名为tmp&a…

【深度解析】滑动窗口:目标检测算法的基石

标题:【深度解析】滑动窗口:目标检测算法的基石 目标检测是计算机视觉领域的一个核心任务,旨在识别图像中所有感兴趣的目标,并确定它们的位置和大小。滑动窗口方法作为目标检测中的一种传统技术,虽然在深度学习时代逐…

Linux 操作系统详解

前言 Linux 是一个强大且开源的操作系统,以其稳定性、灵活性和安全性广受欢迎。它在个人计算机、服务器、嵌入式系统以及超级计算机等多个领域得到广泛应用。本文将从多个角度深入探讨 Linux 的历史、架构和主要特性,为初学者和专业人士提供全面的理解和…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

国内外大模型集合

为了满足日益增长的AI需求,我们精心打造了一站式大模型导航网站,旨在成为连接您与全球顶尖人工智能模型的桥梁。无论您是科研工作者、开发者还是对AI充满好奇的探索者,这里都有您所需。 国内大模型精选 通义千问 —— 阿里巴巴集团倾力打造…

某业帮六月校招后端笔试

题目一 解题思路 签到题,dp就行。 题目二 解题思路 这个比较烦人,需要处理额外的引号和括号。用DFS,对于每个间隙,插入与不插入都搜一遍。 题目三 解题思路: 双指针,左右各一个指针,对比长度&…

OpenLCA、GREET、R语言的生命周期评价方法、模型构建

原文链接:OpenLCA、GREET、R语言的生命周期评价方法、模型构建教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx6&sn1b5758206d500399fe7cc69e800f61fe&chksmfa826657cdf5ef413d31557941a1c5db5cc84bba8d0f408c469e05a4118c…

#LinuxC高级 笔记一

linux命令 什么是嵌入式? 以应用为中心,以计算机技术为基础,软件硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统 计算机系统组成? 硬件、软件 操作系统? ios windows harmo…

k8s_集群搭建_k8s管理前端_dashboard安装部署---分布式云原生部署架构搭建017

然后再去安装一下一个dashboard,有了这个以后,操作k8s集群就不用 一直敲命令了 可以看到上面的命令拿过来,然后 执行就可以了 然后如果执行慢,可以直接先去下载,使用wget,然后再去 也可以在浏览器访问,把内容拿到,然后 下面是内容: # Copyright 2017 The Kubernetes Author…

登 Cell 子刊!清华大学张强锋课题组开发 SPACE 算法,组织模块发现能力领先同类工具

多细胞生物中的细胞尽管共享相同的基因组,但因其内部基因调控网络的差异以及与周围微环境中相邻细胞的外部信号交流,使得它们在形态、基因表达和功能上展现出显著的多样性。为了将细胞类型信息与其在组织内的空间位置相关联,空间转录组学 (Sp…