Перейти к содержанию

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

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

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

src/app.module.ts
import { NecordModule } from 'necord';
import { Module } from '@nestjs/common';
import { IntentsBitField } from 'discord.js';

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

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

src/app.module.ts
import { ConfigModule, ConfigService } from '@nestjs/config';
import { Module } from '@nestjs/common';
import { IntentsBitField } from 'discord.js';
import { NecordModule, NecordModuleOptions } from 'necord';

@Module({
imports: [
NecordModule.forRootAsync({
imports: [ConfigModule.forRoot()],
useFactory: (configService: ConfigService): NecordModuleOptions => ({
token: configService.getOrThrow<string>('DISCORD_BOT_TOKEN'),
intents: [
IntentsBitField.Flags.Guilds,
IntentsBitField.Flags.GuildMessages,
IntentsBitField.Flags.DirectMessages
]
}),
inject: [ConfigService]
})
]
})
export class AppModule {}

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

src/app.module.ts
import { NecordModule } from 'necord';
import { Module } from '@nestjs/common';
import { NecordConfigService } from './discord-config.service';

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

Приведенная выше конструкция создает экземпляр класса NecordConfigService внутри NecordModule, используя его для создания требуемого объекта опций. The class must expose a createNecordOptions() method returning NecordModuleOptions; NecordModule calls this method on the supplied class.

src/discord-config.service.ts
import { Injectable } from '@nestjs/common';
import { NecordModuleOptions } from 'necord';
import { IntentsBitField } from 'discord.js';

@Injectable()
export class NecordConfigService {
public createNecordOptions(): NecordModuleOptions {
return {
token: 'DISCORD_BOT_TOKEN',
intents: [
IntentsBitField.Flags.Guilds,
IntentsBitField.Flags.GuildMessages,
IntentsBitField.Flags.DirectMessages
]
};
}
}

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