中间件

216 阅读3分钟

中间件,特指业务流程的中间处理环节,本质上就是一个function处理函数
在官网中是这样解释的

图片.png 中间件的形参列表中,必须包含next参数。而路由处理函数中只包含req和res

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

const express = require('express')
const app = express()
// middleware 中间件
// 定义一个中间件函数
const mw = function(req,res,next) {
  console.log('这是一个中间件函数');
  // 把流转关系转交给下一个中间件或路由
  next()
}
// 将mw注册为全局生效的中间件
app.use(mw)
app.get('/home',(req,res)=>{
  res.send('home page')
})
app.get('/about',(req,res)=>{
  res.send('about page')
})
app.listen(8080,()=>{
  console.log('server running');
})

图片.png

全局生效的中间件:客户端发起的任何请求,到达服务器之后,都会触发的中间件

注意

  • 一定要在路由之前注册中间件
  • 客户端发送过来的请求,可以连续调用多个中间件进行处理
app.get('/about',mw1,mw2,(req,res)=>{
  res.send('about page')
})
  • 执行完中间件的业务代码之后,不要忘记调用next()函数
  • 为了防止代码逻辑混乱,调用next()函数之后不要再写额外的代码
  • 连续调用多个中间件时,多个中间件之间共享req和res对象

中间件的分类

  1. 应用级别的中间件
  2. 路由级别的中间件
  3. 错误级别的中间件
  4. express内置的中间件
  5. 第三方的中间件
应用级别的中间件

通过app.use()或app.get()或app.post(),绑定到app实例上的中间件

路由级别的中间件

绑定到express.Router()实例上的中间件,router.use()

错误级别的中间件

错误级别的中间件的function处理函数中有4个形参,(err,req,res,next)
注意:错误级别的中间件必须注册在所有路由之后

express内置的中间件
  • express.static快速托管静态资源的内置中间件
  • express.json解析JSON格式的请求体数据
  • express.urlencoded解析URL-encoded格式的请求体数据
const express = require('express')
const app = express()
//注意:除了错误级别的中间件,其他的中间件必须在路由之前进行配置
// 通过express.json()这个中间件,解析表单中的JSON格式的数据
app.use(express.json())
//通过express.urlencoded()这个中间件,来解析表单中的url-encoded格式的数据
app.use(express.urlencoded({extended:false}))
app.post('/user',(req,res)=>{
  // 在服务器可以使用req.body这个属性来接受客户端发送过来的请求体数据
  // 默认情况下,如果不配置解析表单数据的中间件,则req.body默认为undefined
  console.log(req.body);
  res.send('ok')
})
app.post('/list',(req,res)=>{
  // 在服务器端可以使用req.body这个属性来获取JSON格式的表单数据和url-encoded格式的数据
  console.log(req.body);
  res.send('ok')
})
app.listen(8080,()=>{
  console.log('server running');
})

先点击Body然后选择raw再选择JSON 图片.png 图片.png

书写时格式严格按照json格式

图片.png 结果为

图片.png

同样的点击Body之后选择x-www-form-urlcoded,然后输入内容 图片.png 结果为

图片.png

第三方的中间件

经常使用body-parser这个第三方中间件来解析请求体数据
使用步骤:

  1. 运行npm install body-parser安装中间件
  2. 使用require导入中间件
  3. 调用app.use()注册并使用中间件 注意:express内置的express.urlencided中间件就是基于body-parser这个第三方中间件进一步封装出来的,所以使用方法基本相同
const express = require('express')
const app = express()
// 导入解析表单数据的中间件body-parser
const parser = require('body-parser')
app.use(parser.urlencoded({extended:false}))
app.post('/user',(req,res)=>{
  console.log(req.body);
  res.send('ok')
})
app.listen(8080,()=>{
  console.log('server running');
})

图片.png

图片.png