「筆記」- 何謂 Middleware?如何幫助我們建立 Express 的應用程式

Express Middleware 類型

  1. Application-level middleware

Application-level middleware 可以被設定去處理每一個應用程式接收到的請求內容,如同前面的應用程式實作,當中所使用的 app.use() 、app.get() 、app.post() 等等,都是 application-level middleware的代表。

// 使用 method-override
app.use(methodOverride('_method'))

// 查詢一張 picture 的詳細資料
app.get('/pictures/:id', (req, res) => {
})

2. Router-level middleware

Router-level middleware 是屬於 express.Router() 的實例變數 (instance)的 middleware,使用方法跟 application-level middleware 一樣,範例如下:

// 宣告一個名為 router 的 express.Router() 的實體
const router = express.Router()

// 當請求的路由是 GET /todos/:id 時,執行 Router middleware
router.get('/todos/:id', (req, res) => {
// 查詢一個 todo 的詳細資料
})

3. Error-handling middleware

專門來處理錯誤狀況的 middleware,而 Express 的慣例是當一個 middleware 有四個參數時,就代表它是一個 error-handling middleware,所以撰寫 error-handling middleware 時必須提供四個參數,分別為 err、req、res 與 next。

Express 官方文件的範例如下:

app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})

4. Built-in middleware

Express 當中有幾個內建的 middleware,幫助我們處理一些簡單的事情,如同,透過 express.static(‘public’) 可以讀取,由我們自行建立的靜態檔案,包含 JavaScript 、 CSS 檔案。

app.use(express.static('public'))

5. Third-party middleware

Third-party middleware,則是由第三方所撰寫的套件,它需要透過 npm 下載使用,而 Third-party middleware 最大的好處,就是避免讓我們重複造輪子,可以直接引用他人的模組工具來解決自身的專案問題,如同 body-parser 。

// 載入 body-parser
const bodyParser = require('body-parser')

// 使用 body-parser
app.use(bodyParser.urlencoded({
extended: true
}))