Express中间件①(中间件的使用)

网友投稿 249 2022-09-06

Express中间件①(中间件的使用)

文章目录

​​Express中间件​​

​​什么是中间件​​​​Express 中间件的调用流程​​​​Express 中间件的格式​​​​next 函数的作用​​​​定义一个最简单的中间件函数​​​​全局生效的中间件​​​​定义全局中间件的简化形式​​​​中间件的作用​​​​定义多个全局中间件​​​​局部生效的中间件​​​​定义多个局部的中间件​​​​了解中间件的5个使用注意事项​​

Express中间件

什么是中间件

​​中间件(Middleware)​​,特指业务流程的中间处理环节。

我们可以举一个生活中的例子来更好的理解它:

在处理污水的时候,一般都要经过三个处理环节,从而保证处理过后的废水,达到排放标准。

处理污水的这三个中间处理环节,就可以叫做中间件。

注意:中间件是必须要有输入和输出的

Express 中间件的调用流程

当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。

Express 中间件的格式

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

注意:中间件函数的形参列表中,必须包含 next 参数。而路由处理函数中只包含 req 和 res。(我们可以利用这点来区别​​中间件函数​​​和​​路由处理函数​​)

next 函数的作用

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

调用了next函数代表这个中间件处理完毕了,要交给下一个中间件或者路由去处理了

定义一个最简单的中间件函数

可以通过如下的方式,定义一个最简单的中间件函数:

全局生效的中间件

客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件。 通过调用 app.use(中间件函数),即可定义一个全局生效的中间件,示例代码如下:

const express = require('express')const app = express()// 定义一个最简单的中间件函数const mw = function (req, res,) { console.log('这是最简单的中间件函数') // 把流转关系,转交给下一个中间件或路由 next()}// 将 mw 注册为全局生效的中间件app.use(mw)app.get('/', (req,) => { console.log('调用了 / 这个路由') res.send('Home page.')})app.get('/user', (req,) => { console.log('调用了 /user 这个路由') res.send('User page.')})app.listen(80, () => { console.log('express = require('express')const app = express()// 这是定义全局中间件的简化形式app.use((req, res,) => { console.log('这是最简单的中间件函数') next()})app.get('/', (req,) => { console.log('调用了 / 这个路由') res.send('Home page.')})app.get('/user', (req,) => { console.log('调用了 /user 这个路由') res.send('User page.')})app.listen(80, () => { console.log('req 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。

例如现在我们定义一种需求:我们需要获取请求到达服务器的时间

如果我们不使用中间件的话,我们就需要在每一个路由中都进行单个的获取,这无疑非常的麻烦。

const express = require('express')const app = express()app.get('/', (req,) => { const time = Date.now() res.send('Home page.')})app.get('/user', (req,) => { const time = Date.now() res.send('User page.')})app.listen(80, () => { console.log('express = require('express')const app = express()// 这是定义全局中间件的简化形式app.use((req, res,) => { // 获取到请求到达服务器的时间 const time = Date.now() // 为 req 对象,挂载自定义属性,从而把时间共享给后面的所有路由 req.startTime = time next()})app.get('/', (req,) => { res.send('Home page.' + req.startTime)})app.get('/user', (req,) => { res.send('User page.' + req.startTime)})app.listen(80, () => { console.log('app.use() 连续定义多个全局中间件。客户端请求到达服务器之后,会按照中间件定义的先后顺序依次进行调用,示例代码如下:

const express = require('express')const app = express()// 定义第一个全局中间件app.use((req, res,) => { console.log('调用了第1个全局中间件') next()})// 定义第二个全局中间件app.use((req, res,) => { console.log('调用了第2个全局中间件') next()})// 定义一个路由app.get('/user', (req,) => { res.send('User page.')})app.listen(80, () => { console.log('app.use() 定义的中间件,叫做局部生效的中间件,示例代码如下:

定义多个局部的中间件

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

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

① 一定要在路由之前注册中间件(有例外,错误级别的中间件) ② 客户端发送过来的请求,可以连续调用多个中间件进行处理 ③ 执行完中间件的业务代码之后,不要忘记调用 next() 函数 ④ 为了防止代码逻辑混乱,调用 next() 函数后不要再写额外的代码 ⑤ 连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:NodeJS模块化④(模块的加载机制)
下一篇:公关界的007:沙漠中种树有多难?这支企业环保片做出感人回答!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~