Express学习(三)

Express中间件

中间件的概念

  • 什么是中间件
    中间件,特指业务流程的中间处理环节。
  • Express中间件的调用流程
    当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。类似于下图所示
  • Express中间件的格式
    Express的中间件本质上就是一个function处理函数,Express中间件的格式如下:
var express = require('express')
var app = express()app.get('/', function(req, res, next){
next()
})
app.listen(3000)

注意:中间件函数的形参列表中必须包含next参数,而路由处理函数中只包含req和res。

  • next函数的作用
    next函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由。

Express中间件的使用

  • 定义中间件函数
    可以通过如下的方式,定义一个最简单的中间件函数:
//常量new所指向的就是一个中间件函数
const mw = function(req, res, next) {console.log('这是一个最简单的中间件函数')//注意:在当前中间件的业务处理完毕后,必须调用next()函数//表示把流转关系转交给下一个中间件或路由next()
}
  • 全局生效的中间件
    客户端发起的任何请求,到达服务器之后都会触发的中间件,叫做全局生效的中间件。通过调用app.use(中间件函数),即可定义一个全局生效的中间件,示例代码如下:
const mw = function(req, res, next) {console.log('这是一个最简单的中间件函数')//注意:在当前中间件的业务处理完毕后,必须调用next()函数//表示把流转关系转交给下一个中间件或路由next()
}//全局生效的中间件
app.use(mw)
  • 示例如下
    当我们启动该服务器,并打开相应网址我们可以发现在终端中打印如下字样,表示我们是先经过中间件处理,然后响应的get请求,类似于我们之间画的图在这里插入图片描述
  • 定义全局中间件的简化形式
    就稍微修改一下上面的代码即可
app.use(function (req, res, next) {
console.log('这是一个简单的中间件函数')
next()
])
  • 中间件的作用
    多个中间件之间共享同一份req和res。基于这样的特性,我们可以在上游的中间件中,统一为req和res对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
    示例:

  • 定义多个全局中间件
    可以使用app.use()连续定义多个全局中间件。客户端请求到达服务器之后会按照中间件定义的先后顺序依次进行调用,如下:
    在这里插入图片描述
  • 局部生效的中间件
    不使用app.use()定义的中间件就叫做局部生效的中间件,示例如下:在这里插入图片描述
    在这里插入图片描述
    下面是不使用中间件的路由
    在这里插入图片描述
    在这里插入图片描述
  • 定义多个局部中间件
    可以在路由中通过以下两种完全等价的方式使用多个局部中间件:
app.get('/', mw1, mw2, (req,  res) => { res.send('Home page.') })
app.get('/', [mw1, mw2], (req,  res) => { res.send('Home page.') })
  • 中间件的5个使用注意事项
    • 一定要在路由之前注册中间件
    • 客户端发送过来的请求可以连续调用多个中间件进行处理
    • 执行完中间件的业务代码之后,不要忘记调用next()函数
    • 为了防止代码逻辑混乱,调用next()函数之后不要再写额外的代码
    • 连续调用多个中间件时,多个中间件之间共享req和res

中间件的分类

  • 应用级别的中间件
    通过app.use()或app.get()或app.post(),绑定到app实例上的中间件,叫做应用级别的中间件,示例如下:
//应用级别的中间件(全局中间件)
app.use((req, res, next) => {
next()
})//应用级别的中间件(局部中间件)
app.get('/', mw, (req, res) => {
res.send('Home page.')
})
  • 路由级别的中间件
    绑定到express.Router()实例上的中间件,叫做路由级别的中间件。它的用法和应用级别中间件没有任何区别,只不过应用级别的中间件是绑定到app实例上,而路由级别的中间件是绑定到router实例上,示例如下:
const app = express()
const rooter = express.Router()/路由级别的中间件
router.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})app.use('/', router)
  • 错误级别的中间件
    错误级别的中间件的作用:专门用来捕获整个项目发生的异常错误,从而防止项目异常崩溃的问题
    格式:错误级别中间件的function处理函数中,必须有4个形参,形参从前到后,分别是(err,req,res,next)
app.get('/', function(req, res) {   //路由throw new Error('服务器内部发生了错误')   //在程序中主动触发一个错误,一边在后续的错误处理机制中捕获并处理这个错误res.send("Home page.")
})
app.use(function (err, req, res, next) {  //错误级别的中间件console.log('发生了错误:' + err.message)  //在服务器打印错误消息res.send('Error!' + err.message)   //向客户端相应错误相关的内容
})

注意:错误级别的中间件必须注册在所有路由之后!其他级别的中间件必须在路由之前进行配置

  • Express内置的中间件
    • express.static快速托管静态资源的中间件
    • express.json解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
    • express.urlencoded解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
//配置解析application/json格式数据的内置中间件
app.use(express.json())
//配置解析application/x-www-form-urlencoded格式数据的内置中间件
app.use(express.urlencoded({ extended: false}))

注:在服务器可以使用 req.body这个属性接收客户端发送过来的请求体数据,在默认情况下,如果不配置解析表单数据的中间件,req.body默认等于undefined

  • 第三方的中间件
    非Express官方内置的,而是由第三方开发出来的中间件,叫做第三方中间件。在项目中,大家可以按需下载并配置第三方中间件,从而提高项目的开发效率。
    就像我们之前使用过的一样,例如body-parser这个第三方中间件,使用步骤如下:
    运行npm install body-parser安装中间件
    使用require导入中间件
    调用app.use()注册并使用中间件

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

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

相关文章

内联函数|auto关键字|范围for的语法|指针空值

文章目录 一、内联函数1.1概念1.2特性 二、auto关键字2.2类型别名思考2.3auto简介2.4auto使用细则2.4 auto不能推导的场景 三、基于范围的for循环(C11)3.1 范围for的语法 四、指针空值nullptr(C11)4.1 C98中的指针空值 所属专栏:C初阶 一、内联函数 1.1概念 以inline修饰的函…

【LeetCode】升级打怪之路 Day 16:二叉树题型 —— 二叉树的构造

今日题目: 654. 最大二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树 目录 LC 654. 最大二叉树 【easy】 Problem:根据遍历序列来还原二叉树 【classic】 ⭐⭐⭐⭐⭐LC 105. 从前序与中…

小程序 获取 手机号 47001 data format error hint

0.场景 后端获取小程序用户手机号 ,api文档 https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/user-info/phone-number/getPhoneNumber.html 使用hutool工具作为http client 1. 正确的写法 正确示例 String tencentUrl StringUtils.format("https://api…

C++vector的使用方法

文章目录 一、vector的介绍1. 文档链接2. 简要介绍 二、vector的使用1.vector的定义(1)构造函数(2)拷贝构造函数(2)赋值重载 2. vector 增删查改(1)operator [](2&#x…

[HackMyVM]靶场 Quick3

kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (U…

树状数组+离散化求逆序对超详细讲解!

树状数组离散化求逆序对 用一个数组 w [ ] w[] w[]来记录遍历到当前数时,每个数出现的次数 由于只关心每个数前边有多少个数比他大,遍历到 i i i时,求大于 a [ i ] a[i] a[i]的数有多少个,就是对 [ a [ i ] , n ] [a[i], n] [a[i…

HTML—常用标签

常用标签&#xff1a; 标题标签&#xff1a;<h1></h1>......<h6></h6>段落标签&#xff1a;<p></p>换行标签&#xff1a;<br/>列表&#xff1a;无序列表<ul><li></li></ul> 有序列表<ol>&…

她们正在影响AI进程

今天是3月8日&#xff0c;祝广大女性同胞节日快乐&#xff01; 当下&#xff0c;人工智能正是全球科技圈最受关注的领域&#xff0c;甚至没有之一。 在人工智能领域诞生兴起的几十年内&#xff0c;女性科学家作为重要力量&#xff0c;一直在推动行业不断向前发展。 从基础算…

详谈数据结构数组名的含义

谈及背景 int a[3]; sizeof(arr) 12B &#xff0c;这个让我很不理解&#xff0c;后来通过一系列调查研究出了sizeof 一些性质: sizeof()是单目运算符&#xff0c;和‘’一样&#xff0c;不是库函数。sizeof()算结构体的大小 有对应的规则 算结构体大小与结构体中成员排列的顺序…

c++ primer中文版第五版作业第十八章

仓库地址 文章目录 18.118.218.318.418.518.618.718.818.918.1018.1118.1218.1318.1418.1518.16位置一using声明 位置二using声明 位置一using指示 位置二using指示 18.1718.1818.1918.2018.2118.2218.2318.2418.2518.2618.2618.2818.2918.30 18.1 此时r是一个range_error类型…

并查集(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 模板&#xff1a; 题目一&#xff08;合根植物&#xff09;&#xff1a; 代码&#xff1a; 题目二&#xff08;蓝桥幼儿园&#xff09;&#xff1a; 代码&#xff1a; 题目三&#xff08;小猪存钱罐&#xff09;&#xff1a; 代码&#xff1a; …

WebGL之使用着色器将颜色应用于 WebGL

在之前的展示中我们已经创建好了一个正方形&#xff0c;接下来我们要做的就是给它添加一抹色彩。添加颜色可以通过修改着色器来实现。 给顶点着色 在 WebGL 中&#xff0c;物体是由一系列顶点组成的&#xff0c;每一个顶点都有位置和颜色信息。在默认情况下&#xff0c;所有像…

异常-Exception

文章目录 异常-Exception常见的运行时异常NullPointerException&#xff08;空指针异常&#xff09;ArithmeticException&#xff08;数学运算异常&#xff09;ArrayIndexOutOfBoundsException&#xff08;数组下标越界异常&#xff09;ClassCastException&#xff08;类型转换…

Basis运维日常检查清单- Checklist

检查SYSTEM 是否正常GUI登入登入到系统检查所有应用服务器是否活动正常SM51检查所有SAP Instance服务器运行是否正常.检查工作进程进行SM50检查是否有运行时间很长Local ProcessSM66检查是否有运行时间很长Global Process检查陈旧锁定条目SM12在User ID栏输入*. 检查前期的锁列…

网络编程聊天室

客户端 #include <myhead.h> //创建结构体存储用户信息 struct User {char tape;char username[32];char msg[1024]; };int main(int argc, const char *argv[]) {//创建套接字与服务器进行通信int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd-1){perror("socket err…

鸿蒙实战开发Camera组件:【相机】

相机组件支持相机业务的开发&#xff0c;开发者可以通过已开放的接口实现相机硬件的访问、操作和新功能开发&#xff0c;最常见的操作如&#xff1a;预览、拍照和录像等。 基本概念 拍照 此功能用于拍摄采集照片。 预览 此功能用于在开启相机后&#xff0c;在缓冲区内重复采集…

django默认后台管理显示内容深化设置

1、设置models字段展示为只读模式 如某个字段在展示时不允许修改&#xff0c;可在admin.py的注册类下重写函数get_readonly_fields&#xff0c;例&#xff1a; def get_readonly_fields(self, request, objNone): return (dwdm,dwmc,"zjs","yyj"…

ARC-Challenge数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 该数据集由Allen Institute for Artificial Intelligence&#xff08;AI2&#xff09;发布&#xff0c;旨在推动高级问答的研究。该数据集包含…

#微信小程序(按键控制)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a;微信小程序设计两个按钮&#xff0c;对onenet平台数据流&#xff08;旧版&#xff09;来进行http post上传&#xff0c;下位机再http get得到控制信息 3.记录 &#xff08;1&#xff09;bind-tap&#xff08;绑定函数&…

3D数字孪生运行不起来?该检查你的电脑配置了

运行3D数字孪生项目通常需要一定的计算资源和图形处理能力。以下是一些常见的电脑配置要求&#xff0c;可以作为参考&#xff1a;1处理器&#xff08;CPU&#xff09;&#xff1a;推荐使用多核心处理器&#xff0c;如Intel Core i7或更高级别的处理器。较高的时钟频率和较大的缓…