Асинхронная настройка модуля в Nest
Пусть строка папки лежит в файле окружения, а модуль темы должен получить её только после старта приложения. Передавать значение вручную в корне уже неудобно.
Рядом с синхронной настройкой
заводят асинхронный статический
метод на том же классе модуля.
В возвращаемом объекте в
imports указывают
ConfigModule, в провайдере
пишут useFactory с массивом
inject для ConfigService.
Корень подключает
ConfigModule.forRoot
и результат асинхронной сборки.
Покажем на примере постов. Запишем ключ в окружение:
POSTS_FOLDER=posts
Добавим асинхронный метод настройки в модуль темы:
import { DynamicModule, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { PostController } from './post.controller.js';
@Module({})
export class PostsModule {
static registerAsync(): DynamicModule {
return {
module: PostsModule,
imports: [ConfigModule],
controllers: [PostController],
providers: [
{
provide: 'FOLDER',
inject: [ConfigService],
useFactory: (configService: ConfigService) => {
return (
configService.get<string>('POSTS_FOLDER') ??
'posts'
);
},
},
],
exports: ['FOLDER'],
};
}
}
Корневой модуль включит чтение настроек и асинхронное подключение темы:
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { PostsModule } from './posts/posts.module.js';
@Module({
imports: [
ConfigModule.forRoot(),
PostsModule.registerAsync(),
],
})
export class AppModule {}
Соберите имя каталога работников
из ConfigService
в асинхронной настройке
WorkersModule
и отдайте его из
WorkerController.