c语言sscanf函数的用法是什么
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~