NestJS 基礎概念

Esther_Cheung發表於2024-04-08

1. Module

Module是NestJS 的基本組織單位。

模組系統基於 Node.js 的 CommonJS 模組系統,但提供了更高階別的抽象和組織方式。透過使用模組,你可以將應用程式拆分成多個獨立且可複用的部分,每個模組都負責實現特定的功能或業務邏輯。

模組可以封裝相關的程式碼、配置和依賴關係,使得模組內部的實現細節對外不可見,只暴露必要的介面和功能。

模組之間可以定義明確的依賴關係,透過匯入(imports)其他模組來獲取所需的功能和服務。這有助於管理複雜應用程式中的依賴關係,確保元件之間的正確互動。

可以使用 @Module() 裝飾器來定義一個模組,並在裝飾器的後設資料中指定模組的提供者、控制器、匯入的模組等。這樣,NestJS 就可以根據這些資訊來構建和管理應用程式的模組結構。

2. Provider

Provider是基於依賴注入的概念(Dependency Injection,簡稱DI)

是一種實現控制反轉(Inversion of Control,簡稱IoC)的設計模式。

基本思想是解耦,透過外部框架,將類所依賴的物件(Provider)注入到類中,使得類在執行時動態地獲取其所依賴的物件例項,從而實現松耦合。而不是硬編碼方式直接關聯在一起。

在 NestJS 中,你通常在模組的 @Module 裝飾器的 providers 陣列中註冊提供者。這告訴 NestJS 該模組提供了哪些服務或值,並且這些提供者可以在該模組的作用域內被注入到其他類中。同時,如果你需要將提供者匯出到其他模組使用,你可以在 exports 陣列中指定它們。

可以透過裝飾器(如 @Injectable())和建構函式引數來宣告和注入依賴關係,NestJS 會在執行時自動解析這些依賴關係,並將相應的例項注入到類中。

3.Middleware

Middleware實際上是一個函式,它可以在請求或響應物件上執行某些操作,或者在傳遞給下一個處理程式之前進行預處理。這些Middleware函式在請求的處理過程中,按照定義的順序依次執行,形成了一個類似洋蔥模型的層層包裹和處理的結構。


4. Guards(守衛):

通常用於身份驗證、角色檢查或許可權驗證。
是最先執行的中介軟體,用於確定是否允許請求繼續處理。(在請求還沒到控制器之前執行)

5. Interceptors (攔截器):

如果 Guards 允許請求繼續,那麼 Interceptors 會在 Pipes 和Controller方法之前執行。

主要功能為:

    1. 在方法執行前/後繫結額外的邏輯:
      攔截器可以在Controller方法被呼叫之前或之後執行自定義程式碼。這允許你執行如日誌記錄等每個請求都需要執行的任務。

    2. 轉換函式返回的結果:
      你可以使用攔截器來修改從控制器方法返回的資料。例如,你可能希望轉換資料的格式,或新增額外的後設資料到響應中。

    3. 轉換函式丟擲的異常:
      如果控制器方法丟擲了異常,攔截器可以捕獲這個異常,並根據需要轉換它。這可以用於統一異常處理,例如將內部錯誤轉換為更友好的使用者錯誤資訊。

    4. 擴充套件基本函式行為:
      攔截器允許你在不修改原始控制器方法的情況下新增新的功能。這意味著你可以在不破壞現有程式碼的基礎上,增強應用程式的功能。

    5. 根據特定條件完全覆蓋一個函式:
      有時,你可能想要根據某些條件(如快取)完全替換控制器方法的預設行為。攔截器可以做到這一點,透過檢查特定條件,並在滿足這些條件時返回預定義的結果或執行不同的邏輯。

6. Pipes(管道):

主要用於對請求介面的入參進行驗證和轉換的前置操作。(每當一個請求被路由到具體的Controller方法後,會先透過管道對傳入的請求引數進行轉換和驗證 )

7. Exception filters (異常過濾器):

用來處理應用程式中丟擲的異常和錯誤的。

可以實現:
  1. 統一錯誤響應格式
  2. 自定義HTTP狀態碼
  3. 新增額外的響應資訊
  4. 記錄錯誤日誌

相關文章