web-dev-qa-db-fra.com

Globle Module sans importation ne fonctionne pas Nestjs

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.

3
Md Parvez Alam

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.

1
zhuber

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)

0
kaznovac