2024/11/16

NestJS Request LifeCycle

 NestJS 請求生命週期:詳細解說



NestJS 是一個流行的 Node.js 框架,它專注於模組化和可維護性的伺服器端邏輯管理。理解 NestJS 如何運作的關鍵之一,就是了解請求的生命週期。在本文中,我們將逐步介紹每個階段,詳細說明一個請求從進入到結束所經歷的過程。


### 請求進入 (Incoming Request)


每個生命週期的開始都是一個 **請求進入**。這是應用程式接收到 HTTP 請求的初始點。這一步標誌著客戶端互動(通常通過瀏覽器或 API 客戶端)進入 NestJS 應用程式,並觸發整個處理過程。


### 中介軟體 (Middleware)


在請求進入系統後,它會經過 **中介軟體** 的處理。中介軟體用於執行例如日誌記錄、請求驗證,或向請求物件附加額外屬性等任務。在 NestJS 中,中介軟體可以分為兩種類型:


1. **全域中介軟體 (2.1)** - 作用於應用程式中每個路由的中介軟體函數。

2. **模組中介軟體 (2.2)** - 作用於特定模組的中介軟體函數,將其範圍限制於應用程式的某些部分。


中介軟體負責在請求進入下一階段之前進行初步的轉換或檢查。


### 守衛 (Guards)


請求接著進入 **守衛** 階段。守衛用於決定某個請求是否應該繼續處理,特別適合實現授權邏輯。守衛可以在不同層級定義:


1. **全域守衛 (3.1)** - 作用於應用程式所有路由的守衛。

2. **控制器守衛 (3.2)** - 作用於特定控制器的守衛,僅保護該控制器中的路由。

3. **路由守衛 (3.3)** - 作用於特定路由的守衛,提供對每個端點的最細緻控制。


守衛就像是看門人,決定請求是否能夠繼續,或應該被拒絕。


### 攔截器 (Interceptors, Pre-Controller)


一旦請求通過了守衛,它就進入了 **攔截器(控制器前)** 階段。攔截器可用於多種任務,例如在到達控制器之前對請求進行轉換,或者添加特定的日誌或指標。


1. **全域攔截器 (4.1)** - 作用於整個應用程式的攔截器。

2. **控制器攔截器 (4.2)** - 作用於特定控制器的攔截器。

3. **路由攔截器 (4.3)** - 作用於個別路由的攔截器。


攔截器在這個階段允許對請求進行多種修改和附加處理,然後再進入控制器邏輯。


### 管道 (Pipes)


接下來的階段是 **管道**,主要用於數據轉換和驗證。


1. **全域管道 (5.1)** - 作用於整個應用程式的管道,提供一致的驗證或轉換。

2. **控制器管道 (5.2)** - 特定控制器的管道,僅影響該控制器處理的路由數據。

3. **路由管道 (5.3)** - 處理特定路由的驗證和轉換。

4. **路由參數管道 (5.4)** - 直接作用於路由參數的管道,在參數傳入控制器前進行轉換或驗證。


管道確保數據在到達控制器之前符合所需的格式和標準。


### 控制器 (Controller)


當請求成功通過管道後,它最終到達 **控制器**,這是應用程式中處理業務邏輯的核心部分。控制器負責處理特定的路由請求,並根據請求的內容執行對應的業務邏輯。


### 服務 (Service, 如果存在)


在某些情況下,控制器可能會呼叫一個 **服務 (Service)** 來執行更複雜的業務邏輯。服務是一種提供可重用功能的抽象層,它有助於保持控制器的簡潔和專注。


### 攔截器 (Post-Request)


處理完請求後,可能還會有 **後置攔截器** 進行處理,這些攔截器通常用於修改響應或記錄額外的數據。


1. **路由攔截器 (8.1)** - 僅針對特定路由的攔截器。

2. **控制器攔截器 (8.2)** - 僅針對特定控制器的攔截器。

3. **全域攔截器 (8.3)** - 作用於整個應用程式的攔截器。


### 異常過濾器 (Exception Filters)


如果在處理過程中發生錯誤,會進入 **異常過濾器** 階段。異常過濾器用於捕獲和處理應用中的錯誤,並向客戶端返回適當的響應。


1. **路由層級異常過濾器 (9.1)** - 僅應用於特定路由的錯誤處理。

2. **控制器層級異常過濾器 (9.2)** - 僅應用於特定控制器的錯誤處理。

3. **全域異常過濾器 (9.3)** - 作用於整個應用程式的錯誤處理。


### 伺服器響應 (Server Response)


最後一步是 **伺服器響應**。經過所有的處理階段,應用程式將響應發送回客戶端,完成整個請求的生命週期。


理解 NestJS 的請求生命週期有助於構建更加可維護和穩健的應用程式。每個階段都有特定的作用,可以根據應用的需求靈活地加入或配置不同的功能。

圖片來源:

https://medium.com/@daiki01240/nestjs-request-lifecycle-a-complete-guide-to-the-architecture-5ada9666867a