Skip to main content

Configuration asynchrone

Lorsque vous devez passer les options du module de manière asynchrone plutôt que statique, utilisez la méthode .forRootAsync(). Comme pour la plupart des modules dynamiques, Nest fournit plusieurs techniques pour gérer la configuration asynchrone.

Une technique consiste à utiliser une fonction factory :

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 {}

Comme les autres providers de type factory, notre fonction factory peut être asynchrone et peut injecter des dépendances via inject.

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 {}

Vous pouvez également configurer le NecordModule à l'aide d'une classe plutôt que d'une factory, comme indiqué ci-dessous :

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 {}

La construction ci-dessus instancie NecordConfigService à l'intérieur du NecordModule, en l'utilisant pour créer l'objet d'options requis. Notez que dans cet exemple, le NecordConfigService doit implémenter l'interface NecordOptionsFactory, comme indiqué ci-dessous. Le NecordModule appellera la méthode .createNecordOptions() sur l'objet instancié de la classe fournie.

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
]
};
}
}

Si vous souhaitez réutiliser un provider d'options existant plutôt que d'en créer une copie privée à l'intérieur du NecordModule, utilisez la syntaxe useExisting.