Впровадження служби Nest.js з іншого модуля

Впровадження служби з іншого модуля Nest.js включає кілька кроків, щоб забезпечити належне впровадження залежностей і організацію модулів. Використовуючи два приклади модулів, дізнайтеся, як працює процес експорту та імпорту послуг.

Створення проекту Nest.js

Щоб створити проект Nest.js, на вашому пристрої має бути інстальований CLI. Якщо ні, виконайте цю команду, щоб установити його:

 npm install -g @nestjs/cli

Установивши Nest.js CLI, виконайте цю команду, щоб створити новий проект Nest.js:

 nest new <project-name>

Ви можете замінити «<назва-проекту>» будь-якою назвою, яку ви виберете. Виконання команди вище створить новий проект Nest.js із вказаною назвою.

Ваша поточна структура проекту має виглядати так, як показано на зображенні нижче:

Щоб потренуватися впроваджувати службу з одного модуля в інший, ви створите два модулі, module-a і module-b. Ви також створите для них відповідні файли служби та контролера.

Виконайте цю команду, щоб створити модуль 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:

  Виправте помилку SIM-карти Samsung Galaxy Note 5

Експорт служби з модуля A

Щоб експортувати службу module-a з модуля module-a, ви повинні вказати її як експорт у файлі модуля module-a (module-a.module.ts). За замовчуванням Nest.js CLI не надає масив експорту в декораторі @Module, тому створений файл модуля виглядатиме так:

 
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 {}

Щоб зробити service-a (module-a.service.ts) доступним для модулів, які імпортують module-a, створіть масив експорту в декораторі @Module і додайте до нього 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):

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

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

Ця функція повертає зразок рядка. Щоб підтвердити, що ви можете правильно імпортувати цю службу, викличете цю функцію з module-b після введення service-a.

  Як оцінити сюжетні бали для вашого проекту?

Імпорт служби в модуль B

Щоб імпортувати один модуль в інший, ви повинні вказати його як імпорт у масиві імпорту модуля-одержувача. У цьому випадку вам потрібно додати module-a до масиву імпорту декоратора @Module module-b.

Як і раніше, Nest.js CLI не створює автоматично масив імпорту, тому ви повинні додати його вручну.

Спочатку імпортуйте батьківський модуль (module-a.module.ts) у модуль-одержувач (module-b.module.ts), створіть масив імпортів і додайте ModuleAModule до масиву:

 
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 і ModuleAServerice з @nests/common і ../module-a/module-a.service відповідно:

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

Декоратор Inject позначає свій параметр як ціль для ін’єкції залежностей.

Далі до свого класу ModuleBService додайте наведений нижче блок коду:

 @Inject(ModuleAService)
  private readonly moduleAService: ModuleAService;

Блок коду вище надає вашому ModuleBService доступ до методів, доступних у вашому ModuleAService.

  Як створити та роздрукувати етикетки в Microsoft Word

Ви можете протестувати службу, викликавши метод getHello модуля ModuleAService.

 
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 і замініть згенерований код блоком коду нижче:

 
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();
  }
}

Наведений вище блок коду встановлює обробник маршруту GET для функції getHello.

Нарешті, зробіть запит GET за допомогою curl до localhost:3000/module-b/hello. Команда повинна вивести «Привіт з модуля A!» до вашої консолі.

Ви успішно ввели службу в інший модуль. Це може стати в нагоді, коли ви створюєте API за допомогою Nest.js, які мають кілька модулів, які повинні викликати методи один одного.

Переваги міжмодульного впровадження

Хоча прямий виклик служби з іншого модуля спочатку може здатися простішим, у довгостроковій перспективі це може призвести до більш складної, менш зручної для обслуговування та менш масштабованої системи.

Однак крос-модульне впровадження сприяє модульності коду та повторному використанню, полегшуючи його обслуговування. Крім того, він централізує залежності, покращує тестування та підтримує масштабовану, роз’єднану архітектуру.