express的使用(六) 中间件的理解

news2024/11/26 9:37:29

原文链接

express的使用(六) 中间件的理解")
不要脸的求关注,希望能让大家批评我的不足点,方便学习,一键三连最好不过了~另外,乌鸦玩心之钢是真的爽!

看前提示

本篇主要讲的是关于express中间件的一些基础概念,一些简单的demo,让人们了解到中间件的使用方法,如果读者是想要查询某个中间件的具体用法,后续也许会推出

版本依赖

"express": "^4.18.2"

什么是中间件

Express 是一个路由和中间件 Web 框架,其自身只具有最低程度的功能:Express 应用程序基本上是一系列中间件函数调用。

中间件函数能够访问请求对象 (req)、响应对象 (res) 以及应用程序的请求/响应循环中的下一个中间件函数。下一个中间件函数通常由名为 next 的变量来表示。​

常规中间件

既然叫做常规的中间件,那么肯定是最基本的用法了。常规的中间件很简单,当我们使用app.use等方法的时候就可以将我们的方法绑定到app实例对象中,但是请一定要注意,要最后写上next().以便能走到下一步去****

app.use((req, res, next) => {
  console.log("这个是一个常规的中间件");
  next();
})
// 最简单的api
router.get("/index",async (req, res, next) => {
  console.log("进入了api接口");
  return  res.status(200).json("ok"); 
 });

有意思的是,我们要注意一个next(‘router’)的用法,会直接传递给下一个路由,真的很有意思,用法如下

要跳过路由器中间件堆栈中剩余的中间件函数,请调用 next(‘route’) 将控制权传递给下一个路由.注:next(‘route’) 仅在使用 app.METHOD() 或 router.METHOD() 函数装入的中间件函数中有效。

app.get("/test", (res, req, next) => {
  console.log("test1-1");
  next();
}, (res, req, next) => {
  console.log("test1-2");
  next();
});
app.get("/test", (res, req, next) => {
  console.log("test2-1");
  next();
});

在上述代码中,我们定义了三个中间件,且test1-1与test1-2是处于同一个app.get中,而当postman调用/test的时候,结果如下

很正常的逻辑,也符合我们的想法,但如果用下面的代码

app.get("/test", (res, req, next) => {
  console.log("test1-1");
  next('route');
}, (res, req, next) => {
  console.log("test1-2");
  next();
});
app.get("/test", (res, req, next) => {
  console.log("test2-1");
  next();
});

仅仅是在next中加入了一个route,结果却变成了****

路由中间件

路由中间件与常规的中间件一样,只是因为next(’route‘)的用法,想验证下是否也会出现,所以在此单独开一个出来,当然,实际使用过程中不会怎么出现这个情况

// 最简单的api
router.get("/index", async (req, res, next) => {
  console.log("进入了api接口1");
  next('route')
},async (req, res, next) => {
  console.log("进入了api接口1-2");
  next()
});
router.get("/index", async (req, res, next) => {
  console.log("进入了api接口2");
  return res.status(200).json("ok");
});

错误中间件

错误中间件 绝对是一个存在感很低的中间件,但却是很有用的中间件,让我们先看下下面这段代码

app.use((req, res, next) => {
  console.log(dd);
  next();
})

这儿直接打印了一个不存在的dd,肯定在调用的时候会报错,而且事实也是如此

但是如果增加了错误中间件,如

app.use((req, res, next) => {
  console.log(dd);
  next();
})
app.use((err,req, res, next) => {
  console.log("运行项目中出现了一个error")
  console.log(err);
  next();
})

虽然依旧会报错,但是已经可以正常运行了。所以重要性不言而喻,但是,一个健全的错误监听,可不是这么简单的。这个只是一个demo,让大家体会下而已

第三方中间件

这个就不介绍了,我觉得multer的那一篇,已经够清楚了

express的使用(三) multer处理表单提交

内置中间件

笔者想过,是否在这儿给大家写一下关于express.static读取 静态资源,以及express.json等的,但是思考再三,一个是不需要用到,因为有比较好的替换包,一个是我自己也很少 用,怕有坑,有误导,所以这里就略过了

备注

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

要跳过路由器中间件堆栈中剩余的中间件函数,请调用 next(‘route’) 将控制权传递给下一个路由.注:next(‘route’) 仅在使用 app.METHOD() 或 router.METHOD() 函数装入的中间件函数中有效。

资料引用

多年的开发经验以及踩坑

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

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

相关文章

商品支付金额篡改测试-业务安全测试实操(16)

商品支付金额篡改测试,商品订购数量篡改测试 商品支付金额篡改测试 测试原理和方法 电商类网站在业务流程整个环节,需要对业务数据的完整性和一致性进行保护,特别是确保在用户客户端与服务、业务系统接口之间的数据传输的一致性,通常在订购类交易流程中,容易出现服务器端未…

如何在纺织服装行业运用IPD?

纺织服装行业是我国的传统支柱产业,对促进国民经济发展、解决就业、增加国民收入、促进社会和谐发展等方面具有十分重要的意义。纺织服装行业属于劳动密集型产业,产业链上下游关联度较大。产业链上游原材料主要包括棉花、麻、蚕茧丝等天然纤维以及人造纤…

艾默生CE4001S2T2B4控制模块

​ 艾默生CE4001S2T2B4控制模块 艾默生CE4001S2T2B4控制模块 集散控制系统简称dcs,也可直译为“分散控制系统”或“分布式计算机控制系统”。它采用控制分散、操作和管理集中的基本设计思想,采用多层分级、合作自治的结构形式。其主要特征是它的集中管理…

spring boot 校运会赛事管理系统-计算机毕设 附源码87890

spring boot校运会赛事管理系统 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运…

TC8:ICMPv4_TYPE_18-22

ICMPv4_TYPE_18: Send ICMP Destination Unreachable for unknown protocol 目的 主机收到IP Header中协议字段不支持的IP数据包时,回复ICMP目的不可达报文(未知协议) 协议不可达报文的Type为3,Code为2 测试步骤 Tester:发送一条IP报文,其中协议字段值为无效值DUT:发送…

MySQL数据库基础 14

第十四章 视图 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图?2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改、删除视图6.1 修改视图6.2 删除视图…

软考高级系统架构设计师(三) 基础知识之操作系统2(分页/分段/段页存储)

目录 存储管理 页式存储 段式存储 段页式存储 存储管理 存储管理的主要目的:解决多个用户共同使用主存的问题(怎么分配内存??) 主要包括分区存储管理、分页存储管理、分段存储器管理、段页式存储管理以及虚拟存储…

eNSP中对NAT的配置(网络地址转换)

地址转换是把局域网的私有地址转换为公有地址,如果想要上外网,而公有地址是有限的,则需要将私有地址转换成公有地址,用端口号进行区分。 一.基本原理 NAT是改变IP报文中的源或目的地址的一种处理方式;让局域网用户…

清微智能TX5368A与飞桨完成Ⅱ级兼容性测试,助力全行业智能化升级

近日,清微智能的高性能视觉芯片TX5368A与飞桨完成Ⅱ级兼容性测试(基于Paddle2ONNX工具)。测试结果显示,双方兼容性表现良好,整体运行稳定。这是清微智能加入“硬件生态共创计划”后取得的又一阶段性成果。 产品兼容性证…

差分信号隔离放大变送模块光电转换器0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

概述: DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输…

软考高级系统架构设计师(三) 基础知识之操作系统1进程

目录 概要 操作系统 概述 ​编辑 进程管理 进程的状态 进程管理-PV操作 利用PV操作实现进程的同步 进程管理-前趋图 进程管理-死锁 概要 操作系统 概述 操作系统的功能: 进程管理、存储管理、文件管理、作业管理、设备管理 操作系统的特征 并发性共享性虚拟性不…

竞逐对话式AI,百度、字节各有千秋

随着OpenAI陆续发布的ChatGPT引发了AI界热议,新一代的AI热度便开始持续走高。与此同时,以ChatGPT模型为代表的大型预训练模型的出现,也使得对话式AI的生成能力和智能水平得到了飞跃式的提升,得益于此,对话式AI的发展又…

FPGA_学习_10_IP核_PLL

1 PLL IP核配置步骤 (Vivado 赛灵思) 我看的教程里面,那个兄弟是选的下面这个。 看来还是比较注重开发效率。 下面按照截图路径打开这个veo文件,学习如何在FPGA程序中例化IP核(有点像C你创建了一个类,然后你实例化一个&#xff…

MES生产管理系统简介与实践经验分享,一篇就够了

MES系统是制造业企业数字化转型的重要组成部分,也是实现智能制造的基础。本文将从MES系统的定义、功能和应用实践等方面进行介绍和分享。 一、MES系统简介 MES系统(Manufacturing Execution System)又称生产执行系统,是在企业信…

JS自定义打印网页内容(详细全面)

浏览器自身打印 (不在赘述,重点是讲述打印自定义的几种方法与常见的问题) 使用 window.print() 调起浏览器自带的打印预览弹框打印默认会打印 body 里面所有内容const handlePrintPdf = () => {window.print(); }方式一:通过 iframe 打印部分区域 动态创建一个不可见的 i…

【Android -- JNI 和 NDK】认识 NDK

简介 定义:Native Development Kit ,是 Android 的一个工具开发包。 NDK 是属于 Android 的,与 Java 并无直接关系 作用:快速开发 C、 C 的动态库,并自动将 so 和应用一起打包成 APK 即可通过 NDK 在 Android 中 使用…

拼多多买家订单API

目录 订单查询支持两种方式 请求数据格式(指定账号) 请求头示例 数据格式说明 返回数据格式(指定账号) 返回头示例 数据格式说明 不同页面层级各自有什么订单数据 请求数据格式(指定订单编号) 请…

电脑桌面图标打不开?尝试这3个解决方法!

Dam在使用电脑时,无论怎么点击桌面图标都无法打开,他感到很苦恼。遇到电脑桌面图标打不开的情况应该怎么办呢? 电脑桌面上的图标是我们经常使用的快捷方式,但有时候它们可能会出现无法打开的问题。这可能是由于各种原因引起的&…

数字孪生世界建设核心能力:地理信息数据应用能力

地理信息数据是数字孪生的核心基础之一,它能够把真实世界的空间结构和关系映射到数字世界,包含了静态的地理元素和动态的时空变量,如道路、建筑、水系、交通流量、人口密度、环境质量等,它能够反映真实世界的时空特点和动态变化&a…

建设现代化智慧档案八防设备系统解决方案

档案馆库房八防温湿度空气质量一体化解决方案 档案库房是档案事业发展的基石,其主要任务是集中保管国家机构及个人等在各种形式下形成的具有一定价值和保存价值的各种载体档案,主要包括文书档案、科技档案、会计档案、人事档案、实物档案等。随着我国经济…