Express 7 指南 - 开发中间件

news/2024/5/4 15:01:01/文章来源:https://blog.csdn.net/weixin_44226181/article/details/128111088

Express

Express 中文网

本文仅用于学习记录,不存在任何商业用途,如侵删

文章目录

      • Express
      • 7 指南 - 开发中间件
        • 7.1 概述
        • 7.2 例子
          • 7.2.1 中间件函数 myLogger
          • 7.2.2 中间件函数 requestTime
          • 7.2.3 中间件函数 validateCookies
        • 7.3 可配置的中间件

7 指南 - 开发中间件

编写用于 Express 应用程序的中间件

7.1 概述

中间件函数是可以访问请求对象 ( req)、响应对象( res) 和next应用程序请求-响应周期中的函数的函数。

next函数是 Express 路由器中的一个函数,当被调用时,它会在当前中间件之后执行中间件。

中间件函数可以执行以下任务:

  • 执行任何代码。
  • 更改请求和响应对象。
  • 结束请求-响应周期。
  • 调用堆栈中的下一个中间件。

如果当前中间件函数没有结束请求-响应循环,它必须调用next()以将控制权传递给下一个中间件函数。否则,请求将被挂起。

下图显示了中间件函数调用的元素:

在这里插入图片描述

从 Express 5 开始,返回 Promise 的中间件函数将next(value)在它们拒绝或抛出错误时调用。【嗯,现在还是4】

next将使用被拒绝的值或抛出的错误调用。

7.2 例子

一个简单的“Hello World”Express 应用程序示例。

在这里插入图片描述

运行测试下:

在这里插入图片描述

没问题。

接下来,将定义并向应用程序添加三个中间件函数:一个调用myLogger打印简单的日志消息,一个调用requestTime显示 HTTP 请求的时间戳,另一个调用validateCookies验证传入的 cookie。

7.2.1 中间件函数 myLogger

这是一个名为“myLogger”的中间件函数的简单示例。当对应用程序的请求通过它时,此函数只会打印“LOGGED”。中间件函数被分配给一个名为 的变量myLogger

var myLogger = function (req, res, next) {console.log('LOGGED')next()
}

在这里插入图片描述

注意上面对 的调用next()。调用此函数会调用应用程序中的下一个中间件函数。该next()函数不是 Node.js 或 Express API 的一部分,而是传递给中间件函数的第三个参数。该next()函数可以命名为任何名称,但按照惯例,它始终命名为“next”。为避免混淆,请始终使用此约定。

要加载中间件函数,调用app.use(),指定中间件函数。

例如,以下代码myLogger在路由到根路径 (/) 之前加载中间件函数。

在这里插入图片描述

重新运行,测试

在这里插入图片描述

从结果中可以看到,每次应用程序收到请求时,它都会将消息“LOGGED”打印到终端。

中间件加载的顺序很重要:首先加载的中间件函数也会先执行。

如果myLogger在路由到根路径之后加载,则请求永远不会到达它并且应用程序不会打印“LOGGED”,因为根路径的路由处理程序终止了请求-响应循环。

中间件函数myLogger只是打印一条消息,然后通过调用该函数将请求传递给堆栈中的下一个中间件next()函数。

7.2.2 中间件函数 requestTime

接下来,我们将创建一个名为“requestTime”的中间件函数,并为请求对象添加一个名为requestTime` 的属性。

var requestTime = function (req, res, next) {req.requestTime = Date.now()next()
}
var express = require('express')
var app = express()// var myLogger = function (req, res, next) {
//     console.log('LOGGED')
//     next()
// }var requestTime = function (req, res, next) {req.requestTime = Date.now()next()
}app.use(requestTime)app.get('/', function (req, res) {var responseText = 'Hello World!<br>'responseText += '<small>Requested at: ' + req.requestTime + '</small>'res.send(responseText)
})app.listen(3000)

在这里插入图片描述

重启服务,测试

在这里插入图片描述

当您向应用程序的根发出请求时,应用程序现在会在浏览器中显示您的请求的时间戳。

7.2.3 中间件函数 validateCookies

最后,我们将创建一个中间件函数来验证传入的 cookie 并在 cookie 无效时发送 400 响应。

这是一个使用外部异步服务验证 cookie 的示例函数。

async function cookieValidator (cookies) {try {await externallyValidateCookie(cookies.testCookie)} catch {throw new Error('Invalid cookies')}
}

在这里插入图片描述

在这里,我们使用cookie-parser中间件

在这里插入图片描述

从对象中解析传入的 cookiereq并将它们传递给我们的cookieValidator函数。中间件返回一个 Promise ,validateCookies在拒绝时会自动触发我们的错误处理程序。

var express = require('express')
var cookieParser = require('cookie-parser')
var cookieValidator = require('./cookieValidator')var app = express()async function validateCookies (req, res, next) {await cookieValidator(req.cookies)next()
}app.use(cookieParser())app.use(validateCookies)// error handler
app.use(function (err, req, res, next) {res.status(400).send(err.message)
})app.listen(3000)

在这里插入图片描述

运行服务, 测试

在这里插入图片描述

请注意如何next()调用 after await cookieValidator(req.cookies)。这确保了如果cookieValidator解决,堆栈中的下一个中间件将被调用。如果您向next()函数传递任何内容(字符串'route'或除外'router'),Express 会将当前请求视为错误,并将跳过任何剩余的非错误处理路由和中间件函数。

因为您可以访问请求对象、响应对象、堆栈中的下一个中间件函数以及整个 Node.js API,所以中间件函数的可能性是无穷无尽的。

有关 Express 中间件的更多信息,请参阅:使用 Express 中间件。

在这里插入图片描述

7.3 可配置的中间件

如果您需要可配置中间件,请导出一个接受选项对象或其他参数的函数,然后根据输入参数返回中间件实现。

文件:my-middleware.js

module.exports = function (options) {return function (req, res, next) {// Implement the middleware function based on the options objectnext()}
}

现在可以使用中间件,如下所示。

var mw = require('./my-middleware.js')app.use(mw({ option1: '1', option2: '2' }))

Refer to cookie-session and compression for examples of configurable middleware.

有关可配置中间件的示例,请参阅cookie-session和压缩。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

数据结构与算法 -二叉树

二叉树相关算法 1. 二叉树基本知识 &#xff08;1&#xff09;二叉树结构 public class Node {V value;Node left;Node right; }left和right只能往下指&#xff0c;没有节点就为空。 &#xff08;2&#xff09;创建二叉树 对于一个完全二叉树&#xff0c;父节点为i, 左子节点…

Unity3d bounds包围盒 和collider碰撞器区别

Bounds 外包围盒 Bounds 叫作外包围盒、边界框、外扩矩形.是struct 结构体。而我们获得Bounds的主要途径有三种&#xff1a;Render,Collider,Mesh。 Render.bounds 世界坐标 Collider.bounds 世界坐标 Mesh.bounds 本地坐标 var m GetComponent<MeshFilter>().bound…

【数据结构】图的实现

文章目录图1.图的基本概念2.图的存储结构3.邻接矩阵3.1邻接矩阵的优缺点3.2邻接矩阵的实现4.邻接表4.1邻接表的实现5.图的遍历5.1广度优先遍历5.2深度优先遍历5.3如何遍历不连通的图&#xff1f;图 1.图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构&#xff1…

BERT-of-Theseus

最近了解到一种称为"BERT-of-Theseus"的BERT模型压缩方法&#xff0c;源自论文《BERT-of-Theseus: Compressing BERT by Progressive Module Replacing》。这是一种以"可替换性"为出发点所构建的模型压缩方案&#xff0c;相比常规的剪枝、蒸馏等手段&#…

streptavidin-PEG-6-FAM 链霉亲和素-聚乙二醇-6-羧甲基荧光素

产品名称&#xff1a;链霉亲和素-聚乙二醇-6-羧甲基荧光素 英文名称&#xff1a;streptavidin-PEG-6-FAM 纯度&#xff1a;95% 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 外观:固体或粘性液体&#xff0c;取决于分子量 PEG分子量可选&#xff1a;350、550、75…

自助建站工具

每用一次自助建站工具&#xff0c;就有一个程序员失业。 作为企业老板的你&#xff0c;要为公司的获客&#xff0c;企业推广发愁&#xff0c;但是预算有限&#xff0c;招人也很困难&#xff0c;不仅要面试程序员&#xff0c;后续还要检验这个程序员的功力&#xff0c;实在是太…

谷歌浏览器

引言&#xff1a;众所周知&#xff0c;一个好的浏览器可以提高我们的工作效率&#xff0c;那么今天教大家如何安装超 nice 的浏览器 —— 谷歌浏览器 文章目录一、安装谷歌浏览器二、修改谷歌浏览器搜索引擎三、修改谷歌浏览器默认下载位置一、安装谷歌浏览器 打开&#x1f5b…

GJB 5000B二级-II实施基础

本实践域为新增实践域   思想:以GJB5000A的共用过程域中不乏实践为基础进行提炼并提升,结合各个行业的优秀实践和行业特点,坚持问题导向,使标准更具有指导性和可操作性;充分借鉴GJB9001C中:“4组织环境”、“7支持”的相关内容,形成实施基础实践域。本实践域强调突出重…

0111 栈与队列Day1

剑指offer09.用两个栈实现队列 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#x…

Java ArrayLIst与顺序表

什么是集合类&#xff1f; Java当中的集合类&#xff0c;其实就是封装号的数据结构 原始的数据结构——>Java当中封装成的集合对应的那个原始的数据结构——>用Java封装的集合对应的。 集合类所在的包&#xff1a;java.util这个包底下 顺序表的底层是一个数组&#xff0…

结构力学常用公式表,早晚用得到!

来源&#xff1a;360个人图书馆 常用截面几何与力学特征表​​​​​​​ 注&#xff1a; I 称为截面对主轴&#xff08;形心轴&#xff09;的截面惯性矩 (mm4)。基本计算公式如下&#xff1a; W称为截面抵抗矩 (mm)&#xff0c;它表示截面抵抗弯曲变形能力的大小&#xff0c…

皕杰报表之隐藏处理

第一步&#xff0c;新建报表&#xff0c;然后新建参数 参数type设置成中文描述为统计类型、数据类型为字符串。 参数year设置成中文描述为年、数据类型为日期、时间日期格式为yyyy。 参数month设置成中文描述为月、数据类型为日期、时间日期格式为MM。 参数day设置成中文描…

python安全工具开发笔记(三)——python 多线程

一、Python线程和进程 进程 进程是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈及其它记录其运行轨迹的辅助数据。 线程 所有的线程运行在同一个进程当中&#xff0c;共享相同的运行环境。线程有开始顺序执行和结束三个部分。 帮助理解&#xff1a; 1、计算…

VM系列振弦采集模块传感器激励方法

VM系列振弦采集模块传感器激励方法 通过修改寄存器 EX_METH.[3:0]来完成激励方法的选择&#xff0c; EX_METH[4]用于设置是否忽略传感器的接入检测而强制发送激励信号。 高压脉冲激励法 高压脉冲激励法 HPM&#xff08; High Voltage Pulse Excitation Method&#xff09;。 向…

桌面画图工具:Pointofix(fertig)

Pointofix桌面画图工具 Pointofix - der virtuelle Textmarker fr Ihren Bildschirm - Freeware 一、软件下载 官方网址https://www.pointofix.de/ 二、进入下载页面&#xff0c;需要下载安装文件和语言包两个文件 三、网站还提供了一个语言设置小程序&#xff0c;但我没用 …

教师如何创建百度百科词条?这篇带你了解

互联网时代&#xff0c;如果你是小有名气的人物&#xff0c;或是某个领域的专家&#xff0c;对于社会有一定的贡献或是影响力&#xff0c;就可以在百度上搜到一个你的专属词条。 百度百科词条就是个人的一张网络名片&#xff0c;人物的一些基本信息、生平事迹、代表作品、所获…

mac下安装nodejs跟vscode

1.打开官网 Node.js 2.点击下载 3.下载完成&#xff0c;根据提示下一步安装&#xff0c;安装完成后&#xff0c;在vscode中新建一个js文件&#xff0c;执行node test.js

基于STM32单片机的篮球计时记分器proteus仿真原理图PCB

功能&#xff1a; 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示比赛剩余时间&#xff0c;球队分数 2.默认计时器为4节&#xff0c;每节10分钟&#xff0c;每节比赛结束&#xff0c;蜂鸣器报警 3.按键功能介绍: 1’键——加1分 4’键——减1分 2’键——加2分 5’键—…

[附源码]计算机毕业设计springboot人体健康管理app

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

静态路由配置案例

静态路由配置案例配置静态路由原理命令&#xff1a;案例&#xff1a;最后结果&#xff1a;配置静态路由原理命令&#xff1a; [Huawei]ip route-static 来源ip 子网掩码 去向ip [Huawei]ip route-static 192.168.20.1 255.255.255.0 192.168.1.2 案例&#xff1a; pc1,pc2,a…