Node.js - 关于 express 中间件(中间件的分类)

465 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

中间件的分类

Express 官方把常见的中间件用法,分成了五大类

  • 应用级别 的中间件
  • 路由级别 的中间件
  • 错误级别 的中间件
  • Express 内置的中间件
  • 第三方 的中间件

应用级别的中间件

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

// 应用级别的中间件(全局)
app.use((req, res, next) => {
    next()
})

// 应用级别的中间件(局部)
app.get('/', mw1, (req, res) => {
    res.send('home page')
})

路由级别的中间件

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

var app = express()
var router = express.Router()

//路由级别的中间件
router.use(function(req, res, next) {
    next()
})

app.use('/',router)

错误级别的中间件

  • 错误级别中间件的作用:专门用来捕获整个项目中发生的异常错误,从而防止项目异常崩溃的问题

  • 格式:错误级别中间的 function 处理函数中,必须有4个形参,形参顺序从前到后,分别是(err, req, res, next)

  • 注意:错误级别的中间件必须注册在所有路由之后

  • 示例

    const express = require('express')
    const app = express()
    
    // 路由
    app.get(`/`, function(req, res) {
        // 抛开一个自定义的错误
        throw new Error('服务器内部发生了错误')
        res.send(`Home page`)
    })
    
    // 错误级别的中间件
    app.use(function(err, req, res, next) {
        // 在服务器打印错误消息
        console.log('发生了错误' + err.message)
        // 向客户端响应错误相关的内容
        res.send(`Error` + err.message)
    })
    
    app.listen(80, ()=> {
        console.log('express 服务器运行在 http://127.0.0.1.80')
    })
    

    log Snip20220409_14.png


Express 内置的中间件

自 Express 4.16.0 版本开始,Express 内置了3个常用的中间件,极大提高了 Express 项目的开发效率

  • express.static 快速托管静态资源的内置中间件,如 HTML 文件、图片、CSS样式 等

  • express.json 解析 JSON 格式的请求体数据(仅在4.16.0+ 版本中可用)

    // 配置解析, application/json 格式数据的内置中间件
    app.use(express.json())
    
  • express.urlencoded 解析 URL-encoded 格式的请求体数据(仅在4.16.0+ 版本中可用)

     // 配置解析, application/x-www-form-lencoded 格式数据的内置中间件
     app.use(express.urlencoded({extended: false}))
    
  • 示例

    • 通过 express.json() 解析请求体数据

      const express = require('express')
      const app = express()
      
      // 除了错误级别的中间件,其他中间件,必须在路由之前进行配置
      // 通过 express.json() 这个中间件,解析表单中的 JSON 格式的数据
      app.use(express.json())
      
      
      app.post('/user', (req, res) => {
          //在服务器,使用 req.body 这个属性,来获取 JSON 格式的数据
          //默认情况下,如果不配置解析表单数据的中间件,则 req.body 默认等于 undefined
          console.log(req.body)
          res.send('ok')
      })
      
      app.listen(80, ()=> {
          console.log('express 服务器运行在 http://127.0.0.1.80')
      })
      

      log:

      Snip20220410_21.png

    • 通过 express.urlencoded() 解析请求体数据

      const express = require('express')
      const app = express()
      
      // 除了错误级别的中间件,其他中间件,必须在路由之前进行配置
      // 通过 express.urlencoded() 这个中间件,解析表单中的 url-encoded 格式的数据
      app.use(express.urlencoded({extended: false}))
      
      
      app.post('/user', (req, res) => {
          //在服务器,使用 req.body 这个属性,来获取 url-encoded 格式的数据
          //默认情况下,如果不配置解析 url-encoded 格式数据的中间件,则 req.body 默认等于 {} 空对象
          console.log(req.body)
          res.send('ok')
      })
      
      app.listen(80, ()=> {
          console.log('express 服务器运行在 http://127.0.0.1.80')
      })
      

      log:

      Snip20220410_19.png


第三方 的中间件

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

  • 例如,在 express@4.16.0 之前的版本中,经常用 body-parser 这个第三方中间件来解析请求体数据,步骤如下

    • 运行 npm install body-parser
    • 使用 require 导入中间件
    • 调用 aa.use() 注册并使用中间件
  • 示例

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

// 导入解析表单的第三方中间件
const parser = require('body-parser')
// 使用 app.use() 注册三方中间件
app.use(parser.urlencoded({urlencoded: false}))

app.post('/user', (req, res) => {
    console.log(req.body)
    res.send('ok')
})

app.listen(80, ()=> {
    console.log('express 服务器运行在 http://127.0.0.1.80')
})

log: Snip20220410_19.png