Node.js 中间件是怎样工作的?

news2024/11/19 13:25:19

express自带路由功能,可以侦听指定路径的请求,除此之外,express最大的优点就是【中间件】概念的灵活运用,使得各个模块得以解耦,像搭积木一样串起来就可以实现复杂的后端逻辑。除此之外,还可以利用别人写好的中间件,避免重复造轮子。

中间件

express的中间件很简单,其实就是一个函数,拥有req, res, next三个入口参数,分别表示请求上下文,响应上下文,下一个中间件。

function(req, res, next) {
    
}

 

什么是 Express 中间件?

  • 中间件在字面上的意思是你在软件的一层和另一层中间放置的任何东西。
  • Express 中间件是在对 Express 服务器请求的生命周期内所执行的函数。
  • 每个中间件都可以访问其被附加到的所有路由的 HTTP 请求和响应。
  • 另外,中间件可以终止 HTTP 请求,也可以用 next 将其传递给另一个中间件函数。中间件的这种“链”使你可以对代码进行划分并创建可重用的中间件。

编写 Express 中间件的要求

你需要安装一些东西来创建、使用和测试 Express 中间件。首先需要 Node 和 NPM。为确保已经安装,可以运行:

npm -v && node -v

你应该看到已安装的 Node 和 NPM 版本。如果出现错误,则需要安装 Node。所有例子都应在 Node ver 8+ 和NPM ver 5+ 下使用。

本文使用了 Express 4.x 版。这很重要,因为从 3.x 版到 4.x 版有重大的更改。

Express中间件:基础

首先我们使用 Express 最基本的内置中间件。创建一个新项目并 npm 初始化它…

npm init
npm install express --save

Create server.js and paste the following code:

const express = require('express');
const app = express();

app.get('/', (req, res, next) => {
  res.send('Welcome Home');
});

app.listen(3000);

中间件解决什么问题?为什么要用它?

假设你在 web 网络服务器上正在使用 Node.js 和 Express 运行Web应用程序。在此应用中,你需要登录的某些页面。

当 Web 服务器收到数据请求时,Express 将为你提供一个请求对象,其中包含有关用户及其所请求数据的信息。 Express 还使你可以访问响应对象,可以在Web服务器响应用户之前对其进行修改。这些对象通常缩短为 reqres

中间件函数是使用相关信息修改 req 和 res 对象的理想场所。例如用户登录后,你可以从数据库中获取其用户详细信息,然后将这些详细信息存储在 res.user 中。

中间件函数是什么样的?

async function userMiddleware (req, res, next) {
    try {
        const userData = await getUserData(req.params.id);  //see app.get below

        if(userData) {
                req.user = userData;
                next();
        }
    } catch(error)  {
        res.status(500).send(error.message); //replace with proper error handling
    }
}

如果出现错误,并且你不想执行其他代码,则不要调用该函数。请记住在这种情况下要发送响应,否则客户端将会等待响应直到超时。

var app = express();

//your normal route Handlers
app.get('/user/:id', userMiddleware, userController);

中间件链

你可以在中间件数组中或着通过使用多个 app.use 调用来链接中间件:

app.use(middlewareA);
app.use(middlewareB);
app.get('/', [middlewareC, middlewareD], handler);

Express 收到请求后,与请求相匹配的每个中间件都将会按照初始化的顺序运行,直到有终止操作为止。

image.png

因此,如果发生错误,则将按顺序调用所有用于处理错误的中间件,直到其中一个不再调用 next() 函数调用为止。

Express中间件的类型

  • 路由器级中间件,例如:router.use
  • 内置中间件,例如:express.static,express.json,express.urlencoded
  • 错误处理中间件,例如:app.use(err,req,res,next)
  • 第三方中间件,例如:bodyparser、cookieparser
  • 路由器级中间件
  • express.Router 使用 express.Router 类创建模块化的、可安装的路由处理。路由实例是一个完整的中间件和路由系统。

    • 你可以用中间件进行日志记录、身份验证等操作。如下所示,以记录用户的最新活动并解析身份验证标头,用它确定当前登录的用户并将其添加到 Request 对象。
    • 该函数在程序每次收到请求时执行。如果有错误,它会仅结束响应,而不会调用后续的中间件或路由处理。

内置中间件

Express 有以下内置的中间件功能:

  • express.static 提供静态资源,例如 HTML 文件,图像等。
  • express.json 负载解析用 JSON 传入的请求。
  • express.urlencoded 解析传入的用 URL 编码的有效载荷请求。

错误处理中间件

错误处理中间件始终采用四个参数(err,req,res,next)。你必须通过提供四个参数来将其标识为错误处理中间件函数。即使你不需要使用 next 对象,也必须指定。否则 next 对象将被解释为常规中间件,并将会无法处理错误。

node.js 关于express框架使用及其“中间件“概念的理解_AkagiSenpai的博客-CSDN博客

javascript - Node.js 中间件是怎样工作的? - 疯狂的技术宅 - SegmentFault 思否

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

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

相关文章

不可变集合、Lambda表达式、Stream流

不可变集合、Lambda表达式、Stream流 创建不可变集合 不能被修改的集合 应用场景 如果某个数据不能被修改,把它防御性的拷贝到不可变集合中是个很好的实践。 当集合对象被不可信的库调用时,不可变形式是安全的。 创建不可变集合 在List、Set、Map接口中…

智慧仲裁 | 祝贺「璞华法律自助咨询服务平台」在成都医学城劳动纠纷一站式联处中心正式上线运营!

利用互联网开展调解,已成为基层调解的常态。2023年8月,璞华劳动人事法律自助咨询服务平台在成都医学城劳动纠纷一站式联处中心正式上线运营! 平台可以提供智能法律咨询、法律文书模版、赔偿计算、法律法规、仲裁指引、调解指引以及各种劳动人…

MAUI+Masa Blazor APP 各大商店新手发布指南(三)vivo篇

文章目录 前言准备材料审核流程测试报告隐私测试报告隐私行为数据其他问题总结 前言 上架vivo商店,使用厂家的离线推送当然是一个重要原因,与小米不同,vivo的推送服务可以在应用未上架的情况下通过添加测试手机的方式进行测试 准备材料 审…

将AI助手集成到微信公众号中, 无代码实现智能对话能力

1 语聚AI与微信公众号的集成方式展现 集成到微信公众号对话框 搭建一个自动化流程,可以通过流程嵌入的方式将AI助手集成到微信公众号中,后续,在微信公众号对话框, 无代码实现智能对话能力,做您微信公众号的涨粉利器。…

WebGPU助力客户端Crypto/ZK

1. 引言 前序博客: CUDA入门WebGPUZKP:客户端证明WebGPU入门 正如Personae Labs团队2022年11月博客 Efficient ECDSA & the case for client-side proving 中所指出: 仅适用于高端笔记本电脑的5分钟证明生成时长,远不是可行…

医院小程序如何在线搭建?实战解析

在当今数字化时代,移动应用程序成为我们生活中必不可少的一部分。特别是在医疗领域,移动应用程序的需求更为迫切。为了满足这一需求,开发一个医疗小程序成为了许多医疗机构的优先选择。 在本文中,我们将分享一个实战攻略&#xff…

Linux命令awk详细用法

简介 awk 是一种强大的文本处理工具,用于在命令行环境下对文件或数据流进行逐行处理和分析。它是由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 在 1977 年开发的,并以他们三人的姓氏命名。awk 在 Unix/Linux 系统中非常常见,也有 Win…

深入浅出:手把手教你实现顺序表

一、什么是顺序表 顺序表是一种数据结构,或者说,是数据在内存中存储和管理的一种方式。顺序表要求每个数据要从第一个位置开始,依次挨着放。这就很适合使用C语言中的数组来实现。 很多朋友可能会觉得,那有啥可以讲的?我…

Shell - 加固系统配置

文章目录 #! /bin/bash # Function:对账户的密码的一些加固 read -p "设置密码最多可多少天不修改:" A read -p "设置密码修改之间最小的天数:" B read -p "设置密码最短的长度:" C read -p "设置密码失效…

C语言memcpy与memmove

C语言memcpy与memmove memcpy memcpy函数原型 void* memcpy(void* dst,const void* src,size_t size);//const修饰src,表示不应该修改src指向的数据memcpy用于实现数据的拷贝操作,将src往后的size字节数据拷贝到dst指向的空间 memcpy的实现: void*…

头歌MYSQL——课后作业1 数据库和数据表的建立、修改和删除

第1关:建立数据库 任务描述 本关任务:建立数据库 为了完成本关任务,你需要掌握: 如何创建数据库,显示已经建立的数据库 相关知识 创建数据库 创建数据库是在系统磁盘上划分一块区域用于数据的存储和管理。 命令格…

Android片段

如果你希望应用根据不同的环境有不同的外观和行为,这种情况下就需要片段,片段是可以由不同活动重用的模块化代码组件。 片段(Fragment)是活动(Activity)的一种模块化部分,表示活动中的行为或界面…

日本”闲鱼“Mercari煤炉是什么?如何做?

相信做跨境的小伙伴经常听到一个平台:日本煤炉。这是一个跨境电商平台,那么它是什么样的跨境电商平台呢?这个平台好做吗?如何卖货?带着这些问题,接下来小编为大家详细的讲解,帮助大家更好的更了…

开关电源传导发射

开关电源相较于传统的线性电源,具有工作效率高,体积小的优点,因此获得了广泛的应用。但是由于其内部开关管不停的通断,产生了大的du/dt,因此开关电源是产生传导发射的一个主要噪声源,并且由于与电源线直接连…

快速了解状态管理库Pinia及其使用方法

目录 1.pinia是什么 2.为什么要使用pinia 3.pinia的优点 4.pinia在项目中使用 ①创建一个使用pinia的Vue3项目 ②在页面使用store 1.pinia是什么 Pinia 起源于一次探索 Vuex 下一个迭代的实验,如果你学过Vue2,那么你一定使用过Vuex。Vuex在Vue2中主…

《让你的沟通结构化》考试试题及答案截图

中电金信新员工入职培训选修课《让你的沟通结构化》考试答案截图

基于STM32F103C8T6的系统板设计

针对兆易创新旗下型号GD32F103C8T6(兼容STM32F103C8T6)芯片设计的方案验证板,整板由micro USB供电通过1117稳压管稳压输出3.3V供电,中间配备唤醒按键和复位按键,两侧是从芯片引脚引出的IO口用于调试,其中有3.3V、5V电压选择,BOOT0模式选择,SWD调试接口,电源指示灯以及…

二、Mycat2 相关概念及读写分离

第三章 Mycat2 相关概念 3.1 概念描述 1、分库分表 按照一定规则把数据库中的表拆分为多个带有数据库实例,物理库,物理表访问路 径的分表。 解读:分库:一个电商项目,分为用户库、订单库等等。 分表:一张订单表数据数百万&#xff…

时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测

时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测 目录 时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测效果一览基本描述程序设计参考资料 效果一览 基本描述 1.时序预测 | MATLAB实现基于QPSO-BiGRU、PSO-BiGRU、BiGRU时间序列预测&a…

LoRA大模型加速微调和训练算法解读

理论 Lora( Low-Rank Adaotation),低秩自适应模型微调的方法,它冻结预训练模型的权重,并将可训练的秩分解矩阵注入到transformer架构的每一层,从而大大减少下游任务的可训练参数的数量, 怎么微调下游任务:利用LoRA对…