Ir para o conteúdo principal

Configuração Assíncrona

Quando você precisar passar as opções dos módulos de forma assíncrona ao invés de estática, use o método .forRootAsync(). Como os módulos mais dinâmicos, o Nest fornece várias técnicas para lidar com a configuração assíncrona.

Uma técnica é usar uma função de fábrica:

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.Guilds,
IntentsBitField.GuildMessages,
IntentsBitField.DirectMessages
]
})
})
]
})
export class AppModule {}

Como outros provedores de fábrica, nossa função de fábrica pode ser assíncrona e pode injetar dependências por meio de injeção.

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

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

Como alternativa, você pode configurar o NecordModule usando uma classe em vez de uma fábrica, como mostrado abaixo:

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

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

O construtor acima instancia NecordConfigService dentro de NecordModule, usando-o para criar o objeto de opções requerido. Note que, neste exemplo, o NecordConfigService tem que implementar a interface NecordOptionsFactory, como mostrado abaixo. O NecordModule chamará o método .createNecordOptions() do objeto instanciado da classe fornecida.

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

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

Se você quiser reusar um provedor de opções existente em vez de criar uma cópia privada dentro do NecordModule, use a sintaxe useExisting.