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

Pierce Shih
皮爾斯的自學旅程
5 min readMay 12, 2019

程式海無涯,聽說永遠學不完,那我只好一點一點把它們寫下來囉!

Middleware 介紹

在 Express 開發框架中,middleware 會扮演資料庫與應用程式之間的溝通橋樑,透過不同類別的 middleware 讓資料傳遞更加便利,也依照需求對資料做不同的處理。

其實 middleware 的概念很像是一條生產線,若以 iPhone 生產過程來說,蘋果會發出大量訂單的需求,如同網頁端的請求 Request,接著,委由鴻海的生產人員進行 iPhone 組裝,每個人都各自負責不同的工作內容。

有的人負責基底組裝,有的人負責安裝面板…等等,完成自身工作後,再把半成品持續往下一條產線送,如同每一個 middleware 的核心功能,透過執行本身的程式碼來做事,再透過 next 語法呼叫下一個 middleware 跟上做事。

圖片引用來源:Unsplash

Express Middleware 類型

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
}))
圖片引用來源:Unsplash

結語

如同開頭所提,透過 middleware 的使用,可以更有效率幫助我們建立 Express 應用程式,同時,也可以藉由他人所開發的第三方套件,持續優化我們既有的產品。

若想知道更多資訊,歡迎自行查閱 Express Middleware 官方文件

這是一個熱愛挑戰,卻總是傷痕累累的故事,但這不就是人生嗎!如果你喜歡我的分享,請不要吝嗇給予拍手與掌聲,乾溫 :D

--

--

Pierce Shih
皮爾斯的自學旅程

Leading business growth with product mindset and technical perspective