Globle bez modulu import nefunguje nestjs

0

Otázka

Já jsem se snaží realizovat globální modul v nest.js

Vytvořil jsem služby, jako je níže

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());
    // }
    
}

konfigurace.modul.ts

@Global()
@Module({
    providers: [ConfigManager],
    exports: [ConfigManager],
})
export class ConfigurationModule {}

a v app.modul.ts přidáno ConfigurationModule v dovozu.

Také přidat vlastní konstruktor na služby nelze to přidat v modulu.ts soubor.

Já jsem očekával, že bych měl být schopen configData kdekoliv bez importu ConfigManager. ale nefunguje to...

ConfigManager není k dispozici bez dovozu.

javascript nestjs typescript
2021-11-22 10:22:50
3

Nejlepší odpověď

1

Jste pouze označen modulu s @Global malíř, ale NestJS musí nějak inicializovat, že modul, a aby bylo celosvětově k dispozici.

Co to znamená je, že budete muset přidat tento modul do jádra aplikace modulu a NestJS bude dělat zbytek za vás, takže něco takového (nebo však svůj kořen modul je jmenován):

@Module({
  imports: [ConfigurationModule],
})
export class AppModule {}

Z dokumentace

@Global() malíř dělá modul globálním rozsahem. Globální moduly by měla být registrována pouze jednou, obecně root nebo core module.

2021-11-30 08:14:15
0

to je za-design' es6/ts: nemůžete použít třídu bez importu.

mícháte pojmy di (instance/složení) s importem (definování tříd, které jsou k dispozici v modulu rozsah)

2021-12-01 18:47:16
0

Globální moduly v hnízdě pouze znamená, že nemusíte zahrnout, že modul v dovozu: [] pro každý další modul, který vyžaduje poskytovatelů. Poskytovatelé v globální modul stále chová jako normální poskytovatelů, tj. třeba aplikovat tam, kde to potřebujete.

Takže ve vašem případě, protože jste již přidali @Global() ConfigManager a dovážené ConfigurationModule v app.module.tsnebudete muset přidat ConfigurationModule v dovozu pro všechny ostatní moduly, který chcete použít ConfigManager. Ty by, nicméně, stále je třeba aplikovat ConfigManager poskytovatel - je to to, co @Injectable() znamená :).

Udělat injekce, budete potřebovat constructor(private configManager: ConfigManager) {} ve třídě, že potřebuje používat ConfigManagera protože budete potřebovat přístup k typu třídy, budete potřebovat import { ConfigManager } from '../path/to/ConfigManager' stejně.

2021-12-03 00:59:27

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................