Middleware 一般翻譯作「中間件」或是「中介軟體」,其實 Express 應用程式就是由一連串的 middleware 串連而成:
你可以把 middleware 的運作想像成一個加工生產線:
生產線上的員工協力把輸送進來的「原料」(request) 一步步處理加工,完成最後的「製成品」(response)。當一個 middleware 把事情做完之後,它就會呼叫 next() 把請求交給下一個 middleware 來處理。
所以每一個 middleware function 都會帶三個參數:req
、res
、與 next
,例如:
app.use((req, res, next) => {
// do something
return next()
})
綁定到 app 物件的 middleware,被稱為應用程式層級的 middleware。它會在所有路由和路由器層級的 middleware 中運行。
這種 middleware 可以被設定去處理每一個應用程式接收到的請求內容。例如,我們可以使用 app.use()
函數來指定一個或多個特定的 middleware 函數,這些函數將在每次請求時被調用。
同樣地,我們也可以使用 app.get()
或 app.post()
來指定只在特定 HTTP 方法的請求時被調用的 middleware。簡單來說,應用程式層級的 middleware 就像是一個全局過濾器,它會在每次請求時先運行,然後根據需要進行處理或轉發請求。這讓我們可以在請求到達路由之前進行一些預處理,例如驗證、日誌記錄或其他任何我們需要的操作。
使用 路由器層級的 middleware 時,我們會將它綁定到 express.Router()
的實例。它的工作方式與應用程式層級的 middleware 相同,但它只在該路由器的路由中運行。路由器層級的 middleware 就像是一個局部過濾器,它只對綁定到同一個 Router()
實例的路由有效。這意味著,如果你有一組相關的路由,你可以使用一個 Router()
實例來管理它們,並且可以使用路由器層級的 middleware 來對這些路由進行一些共同的預處理,例如驗證或日誌記錄。
錯誤處理 middleware主要工作是處理在其他 middleware 或路由處理函數中產生的錯誤。它的特點是有四個參數:err
、req
、res
和 next
,而不是通常的三個參數。當一個 middleware 函數呼叫了 next(err)
時,Express 會跳過剩下的所有非錯誤處理 middleware,並尋找下一個有四個參數的 middleware 函數,也就是錯誤處理 middleware。
然後,Express 會將錯誤物件 err
傳遞給這個錯誤處理 middleware,讓它來處理這個錯誤。這種機制讓我們可以集中處理錯誤,並提供友好的錯誤訊息或進行錯誤修復。
有一些內建的 middleware 函數,這些函數可以幫助我們處理一些常見的任務。其中一個最常用的內建 middleware 是 express.static
。透過 express.static(‘public’) 可以讀取,由我們自行建立的靜態檔案,包含 JavaScript 、 CSS 檔案。
由第三方所撰寫的套件。我們可以透過 npm 下載並在我們的應用程式中使用這些套件。這些第三方 middleware 的最大好處是,它們可以幫助我們避免重複造輪子,讓我們可以直接引用他人的模組工具來解決我們的專案問題。例如,body-parser
是一個常用的第三方 middleware,它可以幫助我們解析 HTTP 請求的 body。另外,passport
是一個用於身份驗證的 middleware,而 morgan
是一個用於日誌記錄的 middleware。