Nodejs之Express中間件的分類介紹

中間件的分類

為瞭方便大傢理解和記憶中間件的使用,Express官方把常見的中間件用法,分成瞭5大類

分別是

  • 應用級別的中間件
  • 路由級別的中間件
  • 錯誤級別的中間件
  • Express內置的中間件
  • 第三方的中間件

1 應用級別的中間件

通過app.use()或app.get()或app.post(),綁定到app實例上的中間件,叫做應用級別的中間件,代碼示例如下:

隻要是直接通過app.xxx調用的,都可以理解為是應用級別的中間件

// 應用級別的中間件(全局中間件)
app.use((req, res, next) => {
    console.log("這是中間件函數")
    next()
})

// 應用級別的中間件(局部中間件)
app.get("/user", mw, (req, res) => {
    res.send('success')
})

2 路由級別的中間件

綁定到express.Router()實例上的中間件,叫做路由級別的中間件。

它的用法和應用級別中間件沒有任何區別。

隻不過,應用級別中間件是綁定到app實例上,路由級別中間件綁定到router實例上,代碼示例如下:

const express = require("express")
const router = express.Router()

// 路由級別的中間件
router.use((req, res, next) => {
    console.log("Time: ", Date.now())
    next()
})

module.exports = router

3 錯誤級別的中間件

錯誤級別中間件的作用:專門用來捕獲整個項目中發生的異常錯誤,從而防止項目異常崩潰的問題。

格式:錯誤級別中間件的function處理函數中,必須有4個形參,形參順序從前到後,分別是(err, req, res, next)。

// 路由
app.get("/user", (req, res) => {
    throw new Error("服務器內部發生瞭錯誤!")
    res.send("Home Page")
})

// 錯誤級別的中間件,捕獲整個項目的異常錯誤
app.use((err, req, res, next) => {
    console.log("Error: " + err.message)
    res.send("Error: " + err.message)
})

錯誤級別的中間件,必須註冊在所有路由之後,如果放在前面會導致在該中間件之後的錯誤無法被捕獲

4 Express內置的中間件

自Express4.16.0版本開始,Express內置瞭3個常用的中間件,極大的提高瞭Express項目的開發效率和體驗:

  • express.static快速托管靜態資源的內置中間件,例如:HTML文件、圖片、CSS樣式等(無兼容性)
  • express.json解析SON格式的請求體數據(有兼容性,僅在4.16.0+版本中可用)
  • express.urlencoded解析URL-encoded格式的請求體數據(有兼容性,僅在4.16.0+版本中可用)
// 配置解析 application/json 格式數據的內置中間件
app.use(express.json())

// 配置解析 application/x-www-form-urlencoded 格式數據的內置中間件
app.use(express.urlencoded({ extended: false }))

app.post('/user', (req, res)=>{
    // 在服務器, 可以使用 req.body 這個屬性,來接受客戶端端發過來的請求體數據
    // 在默認情況下,如果把配置解析表單數據的中間價, 則 req.body 默認等於 undefined
    console.log(req.body)
    res.send('ok')
})

除瞭錯誤級別的中間件,其他的中間件,必須在路由之前進行配置

5 第三方中間件

非Express官方內置的,而是由第三方開發出來的中間件,叫做第三方中間件。在項目中,大傢可以按需下載並配置第三方中間件,從而提高項目的開發效率。

例如:在[email protected]之前的版本中,經常使用body-parser這個第三方中間件,來解析請求體數據。

使用步驟如下:

  • 運行npm install body-parser安裝中間件
  • 使用require導入中間件
  • 調用app.use()註冊並使用中間件

Express內置的express…urlencoded中間件,就是基於body~parser這個第三方中間件進一步封裝出來的。

總結

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: