Убедитесь, что ваши модули хорошо организованы с помощью чистых и многоразовых инъекций.
Внедрение службы из другого модуля Nest.js включает в себя несколько шагов, обеспечивающих правильное внедрение зависимостей и организацию модуля. Используя два примера модулей, узнайте, как работает процесс экспорта и импорта услуг.
Создание проекта Nest.js
Чтобы создать проект Nest.js, на вашем устройстве должен быть установлен CLI. Если вы этого не сделаете, запустите эту команду, чтобы установить его:
npm install -g @nestjs/cli
Установив интерфейс командной строки Nest.js, запустите эту команду, чтобы создать новый проект Nest.js:
nest new
Вы можете заменить «
Текущая структура вашего проекта должна выглядеть так, как показано на рисунке ниже:
Чтобы попрактиковаться в внедрении службы из одного модуля в другой, вы создадите два модуля: модуль-a и модуль-b. Вы также создадите соответствующие файлы служб и контроллеров.
Запустите эту команду, чтобы сгенерировать модуль-a:
nest generate modulemodule-a
И запустите эквивалентную команду для модуля-b:
nest generate modulemodule-b
Затем запустите эту команду, чтобы сгенерировать файлы службы и контроллера для модуля-a:
nest generate service module-a && nest generate controller module-a
И запустите эквивалентную команду для модуля-b:
nest generate service module-b && nest generate controller module-b
Ваш текущий каталог проекта должен выглядеть следующим образом: источник/модуль-а и источник/модуль-b каталоги:
Экспорт сервиса из модуля A
Чтобы экспортировать сервис модуля-а из модуля-а, вам необходимо указать его как экспорт в файле модуля модуля-а (модуль-a.module.ts). По умолчанию интерфейс командной строки Nest.js не предоставляет экспорт массив в @Модуль декоратор, поэтому сгенерированный файл модуля будет выглядеть так:
// 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],
})
exportclassModuleAModule{}
Чтобы сделать сервис-а(модуль-a.service.ts), доступный модулям, которые импортируют модуль-a, создайте экспорт массив в @Модуль декоратор и добавить МодульAService к этому.
Вот так:
import { Module } from'@nestjs/common';
import { ModuleAService } from'./module-a.service';
import { ModuleAController } from'./module-a.controller';@Module({
providers: [ModuleAService],
controllers: [ModuleAController],
exports: [ModuleAService],
})
exportclassModuleAModule{}
Далее, в целях тестирования, добавьте в ваш модуль простую функцию — служебный файл (модуль-a.service.ts):
import { Injectable } from'@nestjs/common';
@Injectable()
exportclassModuleAService{
getHello(): string {
return'Hello from Module A!';
}
}
Эта функция возвращает образец строки. Чтобы убедиться, что вы можете правильно импортировать эту службу, вы вызовете эту функцию из модуля-b после внедрения службы-а.
Импорт сервиса в модуль B
Чтобы импортировать один модуль в другой, вам необходимо указать его как импортируемый в импорт массив принимающего модуля. В этом случае вам необходимо добавить модуль-a в импорт массив модулей-b @Модуль декоратор.
Как и раньше, интерфейс командной строки Nest.js не генерирует автоматически импорт массив, поэтому вам придется добавить его вручную.
Сначала импортируйте родительский модуль (модуль-a.module.ts) в приемный модуль (модуль-b.module.ts), создайте импорт массив и добавьте МодульAМодуль в массив:
// 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],
})
exportclassModuleBModule{}
Далее откройте свой модуль-b.service.ts файл и импортируйте Вводить декоратор и МодульASService от @nests/common и ../модуль-а/модуль-а.сервис, соответственно:
import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'../module-a/module-a.service';
Вводить декоратор помечает свой параметр как цель для внедрения зависимостей.
Далее в вашем МодульBService class, добавьте блок кода ниже:
@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;
Приведенный выше блок кода предоставляет вашему ModuleBService доступ к методам, доступным в вашем ModuleAService.
Вы можете протестировать службу, вызвав метод ModuleAService. получитьПривет метод.
// module-b.service.ts
import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'src/module-a/module-a.service';@Injectable()
exportclassModuleBService{
@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;
getHello(): string {
returnthis.moduleAService.getHello();
}
}
Далее откройте свой модуль-b.controller.ts файл и замените сгенерированный код блоком кода ниже:
// module-b.controller.ts
import { Controller, Get } from'@nestjs/common';
import { ModuleBService } from'./module-b.service';@Controller('module-b')
exportclassModuleBController{
constructor(private readonly moduleBService: ModuleBService) {}
@Get('/hello')
getHello(): string {
returnthis.moduleBService.getHello();
}
}
Блок кода выше устанавливает ПОЛУЧАТЬ обработчик маршрута для получитьПривет функция.
Окончательно, сделать запрос GET с помощью Curl на локальный хост: 3000/module-b/hello. Команда должна вывести «Привет из модуля А!» на вашу консоль.
Вы успешно внедрили службу в другой модуль. Это может пригодиться, когда вы создание API с помощью Nest.js которые имеют несколько модулей, которым необходимо вызывать методы друг друга.
Преимущества межмодульного внедрения
Хотя прямой вызов службы из другого модуля на первый взгляд может показаться более простым, в долгосрочной перспективе это может привести к созданию более сложной, менее поддерживаемой и менее масштабируемой системы.
Однако межмодульное внедрение способствует модульности кода и возможности повторного использования, что упрощает его обслуживание. Кроме того, он централизует зависимости, улучшает тестируемость и поддерживает масштабируемую, несвязанную архитектуру.