为了方便 理解 与 记忆 中间件的使用,Express官网把中间件进行了如下分类。

1 应用级别的中间件

通过app.use()app.get()app.post() 绑定到app实例上的中间件,叫做应用级别的中间件

const app = express()
// 应用级别的全局中间件
app.use(function(req,res,next){
  next()
})
// 应用级别的局部中间件
app.get('/use',mv1,(req,res)=>{})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

2 路由级别的中间件

绑定到express.route()实例上的中间件,叫做路由级别的中间件,用法与应用级别中间件没有任何区别。只不过,应用级别中间件是绑定到app实例上的,路由级别中间件绑定到router实例上

const app =express()
const router = express.Router()
// 路由级别中间件
router.use(function(req,res,next){
  next()
})
app.use('/',router)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

3 错误级别的中间件

错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目因异常而崩溃
格式:错误级别中间件的function处理函数中必须有四个参数:(err,req,res,next)

const app =express()
const router = express.Router()
app.get('/user/:id/:name',(req.res)=>{
    throw new Error('服务器内部发生了错误!');
    res.send('调用成功')
})
app.use('/api',router)
// 定义错误级别中间件,捕获整个项目的异常错误,从而方式程序的崩溃
app.use((err,req,res,next)=>{
    err.message?res.send('Error:'+ err.message):''
    next()
})	
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

【node】中间件分类_数据错误级别的中间件必须注册在所有路由之后

4 express的内置中间件

Express4.16.0 版本开始,Express内置了3个常用的中间件,极大的提高了Express项目的开发效率与体验
1 express.static 快速托管静态资源的内置中间件,如:html文件、图片、css样式等,无兼容性
2 express.json 解析JSON格式的请求体数据(有兼容性,仅在4.16.0+版本中可用)
3 express.unlencoded解析URL-encoded格式的请求体数据(有兼容性,仅在4.16.0+版本中可用

// 配置解析application/json 格式数据的内置中间件
app.use(express.json())
  • 1.
  • 2.

【node】中间件分类_中间件_02【node】中间件分类_中间件_03

// 配置解析application/x-mmm-form-urlencoded 格式数据的内置中间件
app.use(express.urlencoded({extended:false}))
  • 1.
  • 2.

【node】中间件分类_数据_04【node】中间件分类_json_05

const express = require('express')
const app= express();
// 配置解析application/json 格式数据的内置中间件
app.use(express.json())
// 配置解析application/x-mmm-form-urlencoded 格式数据的内置中间件
app.use(express.urlencoded({extended:false}))


app.post('/api/user/add',function(req,res){
  // 默认情况下,如果不配置解析表单数据的中间件,则req.body为 undefined
   console.log('------',req.body)
    res.send('Add is success')
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

5 第三方的中间件

非Express官方内置的,由第三方开发出来的中间件,叫做第三方中间件,项目中可以按需下载并配置第三方中间件,从而提高项目的开发效率。

  1. 允许npm i body-parser安装中间件
  2. 使用require导入中间件
  3. 调用app.use注册并使用中间件
// 配置解析application/json 格式数据的内置中间件
app.use(bodyParser.json())

// 配置解析application/x-mmm-form-urlencoded 格式数据的内置中间件
app.use(bodyParser.urlencoded({extended:false}))
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

:Express内置express.unlencoded中间件,是基于body.parser这个第三方中间件进步一封装出来的

6 自定义的中间件

自定义中间件实现步骤:

  1. 定义中间件
  2. 监听req的data事件
  3. 监听req的end事件
  4. 使用querystring模块解析请求体数据
  5. 将解析出来的数据对象挂载req.body
  6. 将自定义中间件封装为模块

data事件 来获取客户端发送到服务器的数据。数据量比较大的话,客户端会把数据切割分批发送到服务器端,data事件会触发多次 每次都获取到完整数据的一部分。

end事件 当请求体数据接收完毕之后,会自动触发req的end事件。因此可在end事件中,拿到并处理完整的请求体数据。

const express = require('express')
const app= express();

// 自定义的中间件
app.use(function(req,res)=>{
   let str = ''
   req.on('data',(chunk)=>{
       str+=chunk
   })
   req.on('end',()=>{
       // 将字符串格式的请求体数据,解析成对象格式的数据
       // 下上游的中间件以及路由之间,共享同一段req和res。因此 将解析出来的数据挂载为req的自定义属性,命名为req.body
       const body = qs.parse('str')
       req.body = body
       next() 
    })
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

querystring 模块是node.js内置的一个模块,专门用来处理查询字符串,通过parse()函数处理字符串

const qs = require('querystring')
const body = qs.parse('字符串')
  • 1.
  • 2.
router.get('/user/:id/:name',function(req,res){
    let str = 'nick=casper&age=24';
    const body = qs.parse(str)
    res.send(body)
})
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

【node】中间件分类_中间件_06

中间件或方法作用效果
express.JSON()、bodyParser.json()解析application/json格式数据的,若不配置默认取值为undefined
【node】中间件分类_中间件_02
express.urlencoded({extended:false})、bodyParser.urlencoded({extended:false})解析application/x-mmm-form-urlencoded 格式数据,若不配置默认取值为undefined
【node】中间件分类_数据_04
querystring将查询字符串转为JSON
【node】中间件分类_中间件_06