J'essaie de mettre en œuvre un module global à Nest.js
J'ai créé un service comme ci-dessous
export interface ConfigData {
DB_NAME: string;
}
@Injectable()
export class ConfigManager {
private static _instance?: ConfigManager;
public static configData:ConfigData | null;
private constructor() {
console.log(ConfigManager)
if (ConfigManager._instance)
ConfigManager._instance = this;
else{
ConfigManager._instance = new ConfigManager()
ConfigManager.configData = <ConfigData|null><unknown>ConfigManager.fetchSecretData()
}
}
private static async fetchSecretData():Promise<ConfigData|null>{
// some data from db
}
// static get instance() {
// return ConfigManager._instance ?? (ConfigManager._instance = new ConfigManager());
// //return ConfigManager._instance ?? (ConfigManager._instance = ConfigManager.fetchSecretData()) //new ConfigManager());
// }
}
configuration.module.ts
@Global()
@Module({
providers: [ConfigManager],
exports: [ConfigManager],
})
export class ConfigurationModule {}
et dans App.Module.ts a ajouté ConfigurationModule
dans les importations.
Ajout également un constructeur privé sur le service ne pouvant pas ajouter dans le fichier module.ts.
Je m'attends à ce que je puisse être capable de configData
n'importe où sans importer le configmanager. Mais ça ne marche pas ...
ConfigManager
n'est pas disponible sans importation.
Vous avez seulement marqué votre module avec @Global
Decorator, mais le nidjs doit initialiser ce module et le rendre disponible globalement.
Cela signifie que vous devez ajouter ce module à votre module d'application principal et Nestjs fera le reste pour vous, alors quelque chose comme celui-ci (ou si votre module racine est nommé):
@Module({
imports: [ConfigurationModule],
})
export class AppModule {}
De la documentation
Le décorateur @global () rend le module global-scopé. Les modules globaux ne doivent être enregistrés qu'une seule fois, généralement par le module racine ou noyau.
ceci est "Per-Design" de ES6/TS: vous ne pouvez pas utiliser la classe sans l'importer.
vous mélangez les concepts de DI (instanciation/composition) avec importation (définissant quelles classes sont disponibles dans la portée du module)