Contents

從不同的模組注入 Nest.js 服務

從不同的 Nest.js 模組注入服務涉及幾個步驟,以確保正確的依賴項注入和模組組織。使用兩個範例模組,了解匯出和匯入服務的流程如何運作。

產生 Nest.js 項目

要建立 Nest.js 應用程序,請確保系統上安裝了命令列介面 (CLI)。如果不是,請執行以下命令來設定 CLI:

 npm install -g @nestjs/cli

若要使用 Nest.js 命令列介面 (CLI) 建立新的 Nest.js 項目,請執行以下步驟:1.透過執行指令「npm install-g @nestjs/cli」或「@yarn global add Nestjs-cli」來安裝 Nest.js CLI。這將使您能夠從命令列管理 Nest.js 專案並與之互動。2。執行指令「nest new」在指定目錄中產生一個新的Nest.js專案。新建立的項目的預設配置已設定完畢並準備好進行開發。

 nest new <project-name>

執行所提供的命令後,人們可以用自己選擇的名稱替換“”,以建立一個具有指定名稱的新穎的 Nest.js 開發環境。

您專案的目前配置應符合下面提供的圖形表示中的描述:

/bc/images/nest-js-project-skeleton.jpg

為了磨練跨不同模組整合服務的技能,有必要建立兩個單獨的模組,即 module-a 和 module-b,以及每個模組附帶的服務和控制器檔案。

運行此命令以產生 module-a:

 nest generate module module-a

並為 module-b 運行等效指令:

 nest generate module module-b

若要為 module-a 建立必要的文件,請執行以下命令:

 nest generate service module-a && nest generate controller module-a

並為 module-b 運行等效指令:

 nest generate service module-b && nest generate controller module-b

目前專案目錄的結構應該類似於分層結構,包括兩個主要子目錄,即「src/module-a」和「src/module-b」。

/bc/images/nest-js-project-skeleton-with-modules.jpg

從模組 A 匯出服務

為了從模組 A 中提取服務 A 元件並使其可以在應用程式的其他地方使用,必須將其包含在模組 A 的模組檔案(即 Module-A.exports)下列出的專案中。模組.ts)。通常,當使用 Nest.js 命令列介面 (CLI) 時,「@Module」裝飾器沒有提供預先定義的「exports」陣列;因此,生成的模組檔案將呈現類似於以下的結構:

 // module-a.module.ts
import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
})

export class ModuleAModule {}

為了使導入 module-a 的其他模組能夠存取 module-a.service.ts ,應在 @Module 裝飾器中建立 aexports 數組,並將 ModuleAService 添加到其中。

就像這樣:

 import { Module } from '@nestjs/common';
import { ModuleAService } from './module-a.service';
import { ModuleAController } from './module-a.controller';

@Module({
  providers: [ModuleAService],
  controllers: [ModuleAController],
  exports: [ModuleAService],
})

export class ModuleAModule {}

為了對 module-a 服務執行測試,您可以在與該專案中其他檔案相同的目錄中建立名為 module-a.service.ts 的新檔案。該文件將包含一個簡單的函數,該函數利用“ModuleAService”類別並演示其功能。

 import { Injectable } from '@nestjs/common';

@Injectable()
export class ModuleAService {
  getHello(): string {
    return 'Hello from Module A!';
  }
}

給定的文本似乎是用口語寫的,缺乏精煉。這裡嘗試更優雅地重新表述它:為了確保該服務的正常功能,我們建議在註入 service-a 之後在指定模組(module-b)中呼叫上述函數。透過這樣做,人們可以驗證所述服務的成功整合。

將服務導入模組 B

為了將一個模組匯入到另一個模組中,它必須列在接收模組的 @Module 裝飾器的導入中。因此,在 module-a 被 module-b 導入的情況下,必須將其加到 module-b 的 @Module 裝飾器內的 imports 陣列中。

為了在 Nest.js 專案中使用導入的模組,必須在應用程式模組檔案中手動建立一個「imports」陣列。 Nest.js 命令列介面 (CLI) 預設不提供此功能,需要手動幹預才能包含此功能。

事實上,該過程涉及將父模組從檔案“module-a.module.ts”導入到位於“module-b.module.ts”中的接收模組。此後,在接收模組的程式碼中建立導入語句並將其新增到特定數組中,然後將所需的模組(即“ModuleAModule”)附加到同一數組中。

 // module-b.module.ts
import { Module } from '@nestjs/common';
import { ModuleBController } from './module-b.controller';
import { ModuleBService } from './module-b.service';
import { ModuleAModule } from '../module-a/module-a.module';

@Module({
  imports: [ModuleAModule],
  controllers: [ModuleBController],
  providers: [ModuleBService],
})

export class ModuleBModule {}

事實上,讓我們透過開啟專案中的 module-b.service.ts 檔案來繼續下一步。我們需要從應用程式程式碼庫中的兩個不同來源匯入“@Inject”裝飾器和“ModuleAService”類別。具體來說,對於前者,我們必須從「@nestjs/common」套件中取得這些項目,對於後者,我們必須從項目結構中其他位置的單獨位置取得這些項目。

 import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from '../module-a/module-a.service';

Inject 裝飾器將其參數指定為依賴注入的預期接收者,這表明它是系統功能中的關鍵元件,應該為其提供必要的資源或服務才能有效運作。

事實上,在ModuleBService類別的上下文中,有必要在適當的時候合併上述程式碼片段。

 @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

透過提供的程式碼區塊可以方便地授予對 ModuleAService 方法的存取權限,從而可以在 ModuleBService 中使用。

人們可以透過測試來驗證服務的功能,即 ModuleAService 的「getHello」方法。

 // module-b.service.ts
import { Injectable, Inject } from '@nestjs/common';
import { ModuleAService } from 'src/module-a/module-a.service';

@Injectable()
export class ModuleBService {
  @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

  getHello(): string {
    return this.moduleAService.getHello();
  }
}

事實上,現在讓我們繼續修改 module-b.controller.ts 檔案的內容,用提供的程式碼片段取代現有程式碼。

 // module-b.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ModuleBService } from './module-b.service';

@Controller('module-b')
export class ModuleBController {
  constructor(private readonly moduleBService: ModuleBService) {}

  @Get('/hello')
  getHello(): string {
    return this.moduleBService.getHello();
  }
}

提供的程式碼片段為「getHello」函數建立了 HTTP GET 請求處理機制,該機制負責檢索和處理與使用者特定請求或輸入相關的資料。

最後,使用 cURL 向 http://localhost:3000/module-b/hello 執行 GET 要求。該命令將顯示“Hello from Module A!”在控制台中。

在 Nest.js 中開發 API 時,將服務成功注入另一個模組特別有益,因為這通常涉及需要存取彼此功能的多個相互依賴的模組。

跨模組注入的好處

透過直接呼叫的方式合併服務最初可能看起來是一種權宜之計;然而,隨著時間的推移,它通常會導致架構變得更加複雜、難以維護且範圍有限。

事實上,跨模組注入的實現透過增強模組化和促進組件重用來培育更具凝聚力和適應性的系統。此外,這種方法鞏固了依賴關係,增強了測試的可行性,並實現了架構合理、鬆散耦合的設計,能夠適應成長。