¿Es posible acceder a configuraciones anidadas realizadas por una fábrica de configuraciones dentro de una clase de proveedor simple?

Como:

/*Can't use ConfigService because there is no way of injecting it seemingly*/
export const databaseProviders = [
  {
    provide: 'SEQUELIZE',
    useFactory: async () => {
      const sequelize = new Sequelize({
        host: ConfigService.get<string>('pg.host'),
        port: ConfigService.get<number>('pg.port'),
        dialect: 'postgres',
        username: ConfigService.get<string>('pg.username'),
        password: ConfigService.get<string>('pg.password'),
        database: ConfigService.get<string>('pg.database')
      });
      sequelize.addModels([
         models...
      ]);
      await sequelize.sync(
        process.env.NODE_ENV === 'developent' && {
          force: true
        }
      );
      return sequelize;
    }
  }
];

config/configuration.ts

export default () => ({
  pg: {
    host: 'localhost',
    port: 5432,
    username: process.env.NODE_ENV logic...
    password: process.env.NODE_ENV logic...
    database: process.env.NODE_ENV logic...
  }
});

root.module.ts

...
import { ConfigModule } from '@nestjs/config';
import configuration from './config/configuration';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [configuration]
    }),
...

Si no, ¿es posible incluir ConfigService dentro de una clase de proveedor simple, que no está anotada con @Injectable()

Creo que no porque https://docs.nestjs.com/techniques/configuration#getting -empezó

Usando el ConfigService # Para acceder a los valores de configuración de nuestro ConfigService, primero necesitamos> inyectar ConfigService. Como con cualquier proveedor, necesitamos importar su> módulo contenedor - el ConfigModule - en el módulo que lo usará (a menos que establezca la propiedad isGlobal en el objeto de opciones pasado al método ConfigModule.forRoot () en verdadero). Importarlo a un módulo de funciones como se muestra a continuación.

Sin embargo, es bastante inteligente que pueda realizar algo de lógica basada en process.env.NODE_ENV y cambiar dinámicamente las configuraciones de la base de datos entre producción, preparación, desarrollo, etc. Así que me gustaría mucho una solución que hiciera esto utilizable fuera de solo {{X1 }}s

Supongo que se podría hacer una clase util simple en la raíz del proyecto que logre lo mismo y usarla dentro de la aplicación. Pero creo que esa solución tiene muchos gastos generales.

0
Jonas Grønbek 13 oct. 2020 a las 18:00

1 respuesta

La mejor respuesta

Estás tan cerca de tener la configuración correcta. Mientras crea un proveedor de fábrica, puede inyectar dependencias en la fábrica usando la tecla inject seguida de una matriz de qué inyectar. En su caso, se vería así:

/*Can't use ConfigService because there is no way of injecting it seemingly*/
export const databaseProviders = [
  {
    provide: 'SEQUELIZE',
    inject: [ConifgService], //no worries for imports because you're using a global module
    useFactory: async (configService: ConfigService) => {
      const sequelize = new Sequelize({
        host: configService.get<string>('pg.host'),
        port: configService.get<number>('pg.port'),
        dialect: 'postgres',
        username: configService.get<string>('pg.username'),
        password: configService.get<string>('pg.password'),
        database: configService.get<string>('pg.database')
      });
      sequelize.addModels([
         models...
      ]);
      await sequelize.sync(
        process.env.NODE_ENV === 'developent' && {
          force: true
        }
      );
      return sequelize;
    }
  }
];
4
Jay McDoniel 13 oct. 2020 a las 15:28