在 Express.js 中,中間件是特殊函數,可以存取請求 (req)、回應 (res) 和名為 next 的第三個參數。與常規路由處理程序不同,中間件透過在主要業務邏輯之前執行外部邏輯,在控制應用程式流程方面發揮關鍵作用。
中間件如何運作?
當 HTTP 要求到達 Express.js 伺服器時,它會流經一系列中間件函數。每個中間件可以:
- 修改請求物件(例如附加資料、驗證令牌)。
- 修改回應物件(例如,提前發送回應)。
- 使用 next() 函數將控制權傳遞給堆疊中的下一個中間件。
如果中間件不呼叫 next(),請求-回應週期將在此終止,並且不會執行進一步的邏輯(包括路由處理程序)。
我們為什麼要使用中間件?
中間件非常適合我們需要在處理請求之前添加可重複使用邏輯的場景。例如:
-
驗證:檢查使用者是否已登入(例如,驗證 - JWT 令牌)。
-
授權: 確保使用者擁有執行某些操作所需的權限(例如,管理員可以刪除內容)。
-
請求驗證:驗證是否提供了所有必需的輸入。
-
日誌記錄和監控:記錄傳入請求的詳細資訊以進行分析或偵錯。
-
錯誤處理:全域擷取錯誤以傳送有意義的回應。
定義和使用中介軟體
中間件函數如下圖所示:
-
req(請求): 包含有關傳入 HTTP 請求的資訊(例如標頭、正文、參數)。
-
res(回應):用於將資料傳回客戶端。
next():將控制權傳遞給行中下一個中間件的函數。
中介軟體流程:執行順序
中間件順序很重要! Express 依照定義的順序依序執行中間件。
如果中介軟體定義在路由之後,則不會影響該路由。這就是為什麼必須在 app.js 中的路由之前聲明中間件。
範例:
內部執行流程
以下是逐步發生的事情:
-
傳入請求:請求到達伺服器。
-
中介軟體執行:
- 中間件檢查 req.user.role。
- 如果角色是“admin”,它會呼叫 next() 將控制權傳遞給下一個中間件或路由。
- 如果沒有,中間件會透過發送 403 Forbidden 回應來終止請求。
-
路由處理程序:如果呼叫 next(),則執行相關的路由處理程序(例如 /admin/dashboard)。
流程範例:
- 角色為「admin」的使用者請求/admin/dashboard。
- 中間件記錄「已授予存取權限」並呼叫 next()。
- 路由處理程序發送「歡迎來到管理儀表板!」。
- 角色為「user」的使用者請求/admin/dashboard。
- 中間件記錄「存取被拒絕」並傳送「您無權存取此資源」。
重點
- 中間件就像看門人——它們決定主路由邏輯運行之前會發生什麼。
- 使用 next() 確保流程繼續到下一個中間件或路由。
- 始終在路由之前定義關鍵中間件以確保它們適用。
- 如果您不呼叫 next() 或發送回應,請求將掛起(超時)。
以上是了解 Express.js 中的中間件及其內部運作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!