express中间件

1.中间件的格式

Express的中间件,本质上就是一个 function 处理函数,Express中间件的格式如下:

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

javascript 复制代码
// 常量 mw 所指向的,就是一个中间件函数
const mw = function (req, res, next) {
    console.log("这是一个最简单的中间件函数")
    // 注意: 在当前中间件的业务处理完毕后,必须调用 next()函数
    //表示把流转关系转交给下一个中间件或路由
    next()
}
//客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件
//通过调用 app.use(中间件函数),即可定义一个全局生效的中间件
app.use(mw)


//------定义全局中间件的简化形式------
app.use(function(req, res, next) {
    console.log('这是一个简化过的中间件函数')
    next()
}

2.next函数的作用

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

3.中间件的作用

多个中间件之间,共享同一份 req 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 req 或res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。

4.定义多个全局中间件

可以使用 app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行

javascript 复制代码
app.use(function(req,res,next){ 
    // 第1个全局中间件
    req.one = "这里是第1个全局中间件"
    onsole.log("调用了第1个全局中间件")
    next()
})
app.use(function(req,res,next){ 
    // 第2个全局中间件
    req.two = "这里是第2个全局中间件"
    console.log("调用了第2个全局中间件 ")
    next()
})
app.get('/user', (req,res) =>  {
    // 请求这个路由,会依次触发上述两个全局中间件
    res . send( req.one + "------" + req.two + "------" + " Home page . " )    
    //这里是第1个全局中间件------这里是第2个全局中间件------Home page .
})

5.局部生效的中间件

不使用 app.use() 定义的中间件,叫做局部生效的中间件

javascript 复制代码
//定义中间件函数 mw1
const mw1 = function(req, res, next) {
    console.log("这是中间件函数")
    next()
)}
// m1 这个中间件只在"当前路由中生效",这种用法属于"局部生效的中间件"
app.get("/", mw1, function(req, res) {
    res.send( "Home page ." )
)}
/ mw1 这个中间件不会影响下面这个路由
app.get("/user", function(req, res) ( 
    res.send( "user page.") 
)}

6.定义多个局部中间件

可以在路由中,通过如下两种等价的方式,使用多个局部中间件

javascript 复制代码
//以下两种写法是"完全等价"的,可根据自己的喜好,选择任意一种方式进行使用
app.get("/", mw1, mw2, (req, res) => { res.send( "Home page." ) })
app.get("/", [mw1,mw2], (req, res) => { res.send( "Home page." ) })

7.了解中间件的5个使用注意事项

1)一定要在路由之前注册中间件

2)客户端发送过来的请求,可以连续调用多个中间件进行处理

3)执行完中间件的业务代码之后,不要忘记调用 next()函数

4)为了防止代码逻辑混乱,调用 next()函数后不要再写额外的代码

55)连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象

相关推荐
老马啸西风4 小时前
Neo4j GDS-09-neo4j GDS 库中路径搜索算法实现
网络·数据库·算法·云原生·中间件·neo4j·图数据库
佳腾_11 小时前
【高性能缓存Redis_中间件】三、redis 精通:性能优化与生产实践
redis·缓存·云原生·中间件·云计算
屋昂仼11 小时前
Express中间件(Middleware)详解:从零开始掌握(4)
中间件·express
谢尔登12 小时前
【Sequelize】迁移和种子
后端·express
佳腾_1 天前
【高性能缓存Redis_中间件】一、快速上手redis缓存中间件
redis·缓存·云原生·中间件·高缓存
西岭千秋雪_1 天前
Sentinel核心算法解析の滑动窗口算法
分布式·算法·spring cloud·微服务·中间件·sentinel
老马啸西风1 天前
Neo4j GDS-08-neo4j GDS 库中路径搜索算法介绍
网络·数据库·算法·云原生·中间件·neo4j·
老马啸西风1 天前
Neo4j GDS-13-neo4j GDS 库中节点插入算法实现
数据库·算法·云原生·中间件·embedding·neo4j
乄北城以北乀1 天前
muduo库源码分析: TcpConnection
网络·c++·后端·中间件
weisian1512 天前
中间件--ClickHouse-1--基础介绍(列式存储,MPP架构,分布式计算,SQL支持,向量化执行,亿万级数据秒级查询)
clickhouse·中间件·架构