Estoy tratando de implementar un módulo global en nest.js
He creado un servicio como el siguiente.
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()); // } }configuración.módulo.ts
@Global() @Module({ providers: [ConfigManager], exports: [ConfigManager], }) export class ConfigurationModule {} y en app.module.ts agregó ConfigurationModule en las importaciones.
Además, al agregar un constructor privado en el servicio, no se puede agregar el archivo module.ts.
Espero poder configData en cualquier lugar sin importar el ConfigManager. pero no funciona...
ConfigManager no está disponible sin importar.
Solo marcó su módulo con el decorador @Global , pero NestJS necesita inicializar ese módulo de alguna manera y hacer que esté disponible globalmente.
Lo que esto significa es que debe agregar este módulo a su módulo de aplicación central y NestJS hará el resto por usted, así que algo como esto (o como se llame su módulo raíz):
@Module({ imports: [ConfigurationModule], }) export class AppModule {}De la documentación
El decorador @Global() hace que el módulo tenga un alcance global. Los módulos globales deben registrarse solo una vez, generalmente por el módulo raíz o central.
esto es 'por diseño' de es6/ts: no puede usar la clase sin importarla.
está mezclando los conceptos de di (ejemplificación/composición) con importación (definiendo qué clases están disponibles en el alcance del módulo)
Los módulos globales en nido solo significan que no tiene que incluir ese módulo en las importaciones: [] de cualquier otro módulo que requiera sus proveedores. Los proveedores en el módulo global aún se comportan como proveedores normales, es decir, debe inyectarlo donde lo necesite.
Entonces, en su caso, dado que ya agregó @Global() a ConfigManager e importó ConfigurationModule en app.module.ts , no necesitará agregar ConfigurationModule en las importaciones para ningún otro módulo que desee usar ConfigManager . Sin embargo, aún necesitaría inyectar el proveedor ConfigManager ; eso es lo que significa @Injectable() :).
Para hacer la inyección, necesita un constructor(private configManager: ConfigManager) {} en la clase que necesita usar ConfigManager , y dado que necesita acceso al tipo de clase, necesitará import { ConfigManager } from '../path/to/ConfigManager' también.