Повторное использование модуля в Nest
Пусть опубликованные записи и черновики читают из разных каталогов, а код модуля темы один. Если дважды записать один и тот же токен, значения в контейнере смешаются.
Каждый вызов статического метода
настройки создаёт отдельный
экземпляр модуля со своим
списком провайдеров. Имена
токенов в provide должны
различаться, тогда два каталога
живут рядом без конфликта.
У каждого адреса свой контроллер
и свой токен.
Покажем на примере постов. Расширим метод настройки полем имени токена:
import { DynamicModule, Module, Type } from '@nestjs/common';
@Module({})
export class PostsModule {
static register(options: {
folder: string;
token: string;
controller: Type;
}): DynamicModule {
return {
module: PostsModule,
controllers: [options.controller],
providers: [
{
provide: options.token,
useValue: options.folder,
},
],
exports: [options.token],
};
}
}
Первый контроллер вернёт каталог опубликованных записей:
import { Controller, Get, Inject } from '@nestjs/common';
@Controller('posts')
export class PostController {
folder: string;
constructor(@Inject('POSTS_FOLDER') folder: string) {
this.folder = folder;
}
@Get()
getFolder(): string {
return this.folder;
}
}
Второй контроллер покажет каталог черновиков по другому токену:
import { Controller, Get, Inject } from '@nestjs/common';
@Controller('drafts')
export class DraftController {
folder: string;
constructor(@Inject('DRAFTS_FOLDER') folder: string) {
this.folder = folder;
}
@Get()
getFolder(): string {
return this.folder;
}
}
Корень подключит модуль темы два раза с разными парами токена и папки:
import { Module } from '@nestjs/common';
import { DraftController } from './posts/draft.controller.js';
import { PostController } from './posts/post.controller.js';
import { PostsModule } from './posts/posts.module.js';
@Module({
imports: [
PostsModule.register({
folder: 'posts',
token: 'POSTS_FOLDER',
controller: PostController,
}),
PostsModule.register({
folder: 'drafts',
token: 'DRAFTS_FOLDER',
controller: DraftController,
}),
],
})
export class AppModule {}
Подключите WorkersModule
дважды с разными токенами каталога
и верните каждую строку из своего
WorkerController
и ArchiveController.