Skip to main content

Асинхронная конфигурация

Если вам нужно передать параметры модуля асинхронно, а не статически, используйте метод .forRootAsync(). Как и большинство динамических модулей, Nest предоставляет несколько методов для работы с асинхронной конфигурацией.

Один из приемов - использование фабричной функции:

src/app.module.ts
import { NestCordModule } from '@globalart/nestcord';
import { Module } from '@nestjs/common';
import { IntentsBitField } from 'discord.js';

@Module({
imports: [
NestCordModule.forRootAsync({
useFactory: () => ({
token: 'DISCORD_BOT_TOKEN',
intents: [
IntentsBitField.Guilds,
IntentsBitField.GuildMessages,
IntentsBitField.DirectMessages
]
})
})
]
})
export class AppModule {}

Как и другие factory providers, наша фабричная функция может быть асинхронной и может инжектировать зависимости через inject.

src/app.module.ts
import { NestCordModule } from '@globalart/nestcord';
import { Module } from '@nestjs/common';
import { IntentsBitField } from 'discord.js';

@Module({
imports: [
NestCordModule.forRootAsync({
imports: [ConfigModule.forFeature(nestcordModuleConfig)],
useFactory: async (configService: ConfigService) => ({
token: configService.get<string>('DISCORD_BOT_TOKEN'),
intents: [
IntentsBitField.Guilds,
IntentsBitField.GuildMessages,
IntentsBitField.DirectMessages
]
}),
inject: [ConfigService]
})
]
})
export class AppModule {}

В качестве альтернативы вы можете настроить модуль NestCordModule, используя класс вместо фабрики, как показано ниже:

src/app.module.ts
import { NestCordModule } from '@globalart/nestcord';
import { Module } from '@nestjs/common';
import { IntentsBitField } from 'discord.js';

@Module({
imports: [
NestCordModule.forRootAsync({
useClass: NestCordConfigService
})
]
})
export class AppModule {}

Приведенная выше конструкция инстанцирует NestCordConfigService внутри NestCordModule, используя его для создания требуемого объекта опций. Обратите внимание, что в этом примере служба NestCordConfigService должна реализовать интерфейс NestCordOptionsFactory, как показано ниже. Модуль NestCordModule вызовет метод .createNestCordOptions() на инстанцированном объекте предоставленного класса.

src/discord-config.service.ts
import { Injectable } from '@nestjs/common';
import { NestCordOptionsFactory, NestCordModuleOptions } from '@globalart/nestcord';
import { IntentsBitField } from 'discord.js';

@Injectable()
class NestCordConfigService {
createNestCordOptions(): NestCordModuleOptions {
return {
token: 'DISCORD_BOT_TOKEN',
intents: [
IntentsBitField.Guilds,
IntentsBitField.GuildMessages,
IntentsBitField.DirectMessages
]
};
}
}

Если вы хотите использовать существующий поставщик опций вместо того, чтобы создавать его частную копию внутри NestCordModule, используйте синтаксис useExisting.