nestjs 全栈进阶--中间件

视频教程

22_nest中中间件_哔哩哔哩_bilibili

1. 介绍

在Nest.js框架中,中间件(Middleware)是一个非常重要的概念,它是HTTP请求和响应生命周期中的一个重要组成部分,允许开发者在请求到达最终的目的控制器方法之前或响应返回客户端之前,对请求或响应进行预处理或后处理。

Nest.js中间件的工作原理是基于洋葱模型(Onion Architecture),也就是请求依次通过一层层的中间件,每个中间件都可以选择是否继续将请求传递给下一个中间件或者提前结束请求。

nest new middleware -p pnpm
pnpm start:dev

2. 对所有路由使用

nest g middleware aaa --no-spec --flat

生成的文件

因为它不知道你用的 express 还是 fastify,所以 request、response 是 any,我们自己修改下

import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';@Injectable()
export class AaaMiddleware implements NestMiddleware {use(req: Request, res: Response, next: () => void) {console.log('开始执行中间件aaa...');next();console.log('结束执行中间件aaa...');}
}

然后在 Module 里这样使用: 实现 NestModule 接口的 configure 方法,在里面应用 AaaMiddleware 到所有路由。

浏览器访问 http://localhost:3000

3. 精确路由使用

先添加几个 handler

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) { }@Get()getHello(): string {console.log('getHello');return this.appService.getHello();}@Get('hello2')getHello2(): string {console.log('getHello2');return this.appService.getHello();}@Get('hello3')getHello3(): string {console.log('getHello3');return this.appService.getHello();}@Get('hello4')getHello4(): string {console.log('getHello4');return this.appService.getHello();}@Get('hello5')getHello5(): string {console.log('getHello5');return this.appService.getHello();}
}

然后重新指定 Middleware 应用的路由

当你 访问hello2这个路由时:

4. 注入其他服务到中间件

学习过Express的同学,应该会发现,nest的中间件和Express 的 中间件 差别并不大,无非是变成了 class 的方式,那他为什么要采用class的方式呢?

答案是:为了依赖注入,比如我们可以将AppService 注入到 中间件

import { Inject, Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response } from 'express';
import { AppService } from './app.service';@Injectable()
export class AaaMiddleware implements NestMiddleware {constructor(private readonly appService: AppService) { }use(req: Request, res: Response, next: () => void) {console.log('开始执行中间件aaa...');console.log('----------', this.appService.getHello());next();console.log('结束执行中间件aaa...');}
}

5. nest参数和@Nest装饰器

他的作用就是调用下一个 middleware,

@Next 装饰器是调用下一个 handler 的

当我们再次访问 http://localhost:3000/,你会发现他就卡在这里不动了,这个和加上 @Response 装饰器的时候的效果一样,Nest 认为你会自己返回响应或者调用下个 handler,就不会处理返回值了

此时,我们手动next,

你会发现他404,因为传入 Next 参数的时候,一般是不需要在这里响应的,一般是调用下个 handler 来响应

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

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

相关文章

04.进程间通信

进程间通信基本概念 IPC(Inter Process Communication) 进程间通信 进程通信就是不同进程之间进行信息的交换或传播 为什么进程之间实现通信和困难 因为进程之间具有独立性,数据独立,程序可能独立也可能不独立(父子进…

从面试官视角出发,聊聊产品经理的面试攻略

一、请进行自我介绍 这题基本是面试的开胃菜了,估计面试多的,自己答案都能倒背如流啦。 其实自我介绍还是蛮重要的,对我来说主要有 3 个作用:面试准备、能力预估、思维评估。 面试准备:面试官每天都要面 3 ~6 人&am…

Windows系统下通过nginx配置多项目

文章目录 前言大概思路实际操作记录:查看nginx 错误日志问下AI注意点: 当访问域名根路径时,重定向到/pc总结 前言 在windows电脑启动一个nginx 测试配置多前端项目,一个pc端(vue3tsvite ,history路由&…

【C++进阶】C++中的map和set

一、关联式容器 在初阶阶段,我们已经接触过STL 中的部分容器,比如: vector 、 list 、 deque, forward_list 等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本…

ChatGLM3-6B部署与微调及微调后使用

记录ChatGLM3-6B部署及官方Lora微调示例详细步骤及如何使用微调后的模型进行推理 一、下载代码 使用git clone 命令下载源码 git clone https://github.com/THUDM/ChatGLM3.git 如图所示 二、下载模型 模型权重文件从魔塔进行下载,不需要翻墙。权重文件比较大&…

【docker 】push 镜像到私服

查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…

设计合理的IT运维服务目录:打造高效运维的蓝图

在数字化转型的浪潮中,一个设计合理、内容详尽的IT运维服务目录是连接服务提供者与消费者之间的桥梁,它不仅体现了服务设计的专业性,还直接影响着运维效率和服务质量。如何设计出既合理又高效的IT运维服务目录?让我们结合ITIL 4框…

【全开源】JAVA台球助教台球教练多端系统源码支持微信小程序+微信公众号+H5+APP

功能介绍 球厅端:球厅认证、教练人数、教练的位置记录、助教申请、我的项目、签到记录、我的钱包、数据统计 教练端:我的页面,数据统计、订单详情、保证金、实名认证、服务管理、紧急求助、签到功能 用户端:精准分类、我的助教…

Maven的使用

1.第一个Maven工程 1.1 创建约定目录结构 ​ Hello ​ src ​ ——main(存放主程序) ​ ————java(存放源代码文件) ​ ————resources(存放配置文件和资源文件) ​ ——test(存放测试程序) ​ ————java ​ ————resources ​ pom.xml 1.2 创建核心文件 pom.xml …

mysql等保测评2.0命令-三级

版本 Win默认安装位置 C:\Program Files\MySQL\MySQL Server 8.0\bin 版本:select version() from dual; 身份鉴别 a应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 1、SELEC…

新能源汽车中HEV与PHEV分别代表什么车型,它们与传统燃油车都有什么区别?

前言 新能源汽车正逐渐成为全球汽车工业的主流方向,而HEV(Hybrid Electric Vehicle)和PHEV(Plug-in Hybrid Electric Vehicle)这两种混合动力车型在这一转型过程中扮演着重要角色。下面我们详细探讨HEV与PHEV的定义&a…

RAG查询改写方法概述

在RAG系统中,用户的查询是丰富多样的,可能存在措辞不准确和缺乏语义信息的问题。这导致使用原始的查询可能无法有效检索到目标文档。 因此,将用户查询的语义空间与文档的语义空间对齐至关重要,目前主要有查询改写和嵌入转换两种方…

扫码查看文件是如何实现的?文件活码在线生成的方法

现在很多场景下会通过扫码的方式来查看文件,这种方式可以让更多的人同时通过扫码的方式来查看二维码,有利于文件的快速分享以及用户获取内容的个人体验,而且可以保护文件的安全性,那么如何制作文件二维码呢? 文件二维…

中国211大学全部排名一览表

211大学是指中国教育部实施的名为“211工程”的高等教育发展战略中被选为重点支持的高等院校。这个名称来源于项目的启动背景和目标:“211”中的“21”代表21世纪,意味着该项目面向21世纪的中国高等教育发展;“1”则意指要重点建设大约100所左…

商机无限:实景无人自动直播软件带动实体店和电商行业新一波繁荣!

直播带货风潮的兴起确实是近年来电商行业的一个显著趋势。短视频平台的崛起为直播电商开辟了新的商业蓝海,商家们也纷纷加入到直播带货的行列中。然而,对于许多商家来说,找到合适的主播并不容易,这给他们带来了一定的困扰。hhgg加…

API接口开发实现一键智能化自动抓取电商平台数据商品详情支持高并发免费接入示例

要开发一个API接口,用于自动抓取电商平台的商品详情数据,并支持高并发和免费接入,你需要考虑以下几个步骤: 确定目标电商平台和商品详情的数据结构。设计API接口规范,包括请求和响应格式。实现数据抓取逻辑&#xff0…

Ryght 在 Hugging Face 专家助力下赋能医疗保健和生命科学之旅

本文是 Ryght 团队的客座博文。 Ryght 是何方神圣? Ryght 的使命是构建一个专为医疗保健和生命科学领域量身定制的企业级生成式人工智能平台。最近,公司正式公开了 Ryght 预览版 平台。 Ryght 预览版https://www.ryght.ai/signup?utm_campaignPreview%2…

各种数据获取stream流的方式

1.单列集合&#xff08;直接调用&#xff09; ArrayList<Integer> list new ArrayList<>();list.stream(); 2.双列集合 HashMap<String, Integer> map new HashMap<>();map.put("aaa",111);map.put("bbb",222);map.put("c…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前&#xff0c;先了解一下声波的概念以及超声波和声波之间的关系 什么是声波&#xff1f; 声波是物体机械振动状态&#xff08;或能量&#xff09;的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式&#xff0c;这种振动状…

工厂模式应用实例

引言 设计模式概念 设计模式&#xff08;Design Pattern&#xff09;的官方概念可以表述为&#xff1a;在软件设计中&#xff0c;设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它是针对特定问题或特定场景的解决方案&#xff0c;是一种经过…