NestJS nos permite leer el archivo .env a través de ConfigModule y puedo hacerlo fácilmente en mis módulos con un código como el siguiente
@Module({ imports: [ConfigModule.forRoot()], providers: [ NVFullNameSearchService, NVPartialNameSearchService, NVPersistService, ], controllers: [NvController], })Pero el código anterior es más para tratar dentro de los módulos, ¿cómo puedo leer el contenido del archivo .env en main.ts? ¿Diga que necesito configurar el puerto y el host para mi servicio Redis?
const microserviceOptions = { name: 'plscorecard', transport: Transport.REDIS, options: { url: 'redis://localhost:6379', }, }; async function bootstrap() { const app = await NestFactory.createMicroservice( NVModule, microserviceOptions, ); app.listen(() => { logger.log('NameVerification Redis microservice is listening ... '); }); } bootstrap();Como puede ver, la aplicación aún no se ha creado en este caso. ¿Debo usar directamente dotenv? Como era de esperar en cualquier entorno empresarial, tengo diferentes archivos env para DEV, QA, UAT y Production. ¿Cuál es la forma más fácil/correcta de lograrlo?
Gracias por todo tu apoyo. Así es como lo arreglé
**app.module.ts** import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: `config/${process.env.NODE_ENV}.env`, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}Ahora que el módulo tiene la configuración correcta, lo único que queda es invocarlo desde main.ts de una manera menos convencional pero documentada.
**main.ts** import { Logger } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { Transport } from '@nestjs/microservices'; import { AppModule } from './app.module'; import { ConfigService } from '@nestjs/config'; async function bootstrap() { const logger = new Logger('main'); const app = await NestFactory.create(AppModule); const configService = app.get(ConfigService); const REDIS_HOST = configService.get<string>('REDIS_HOST'); const REDIS_PORT = configService.get<number>('REDIS_PORT'); const microserviceOptions = { transport: Transport.REDIS, options: { url: `redis://${REDIS_HOST}:${REDIS_PORT}`, }, }; app.connectMicroservice(microserviceOptions); const PORT = configService.get<number>('PORT'); const environment = configService.get<string>('NODE_ENV'); const title = configService.get<string>('ENVIRONMENT_TITLE'); await app.listen(PORT); logger.log( `${environment}, Microservice ready to receive Redis messages in PORT - ${PORT}\n Environment - ${title}`, ); } bootstrap();Puede evitar usar dotenv usando su servicio de configuración en su main.ts con el método app.get() .
import { ConfigurationService } from './core/configuration/configuration.service'; async function bootstrap() { const configurationService = app.get(ConfigurationService); await app.listen(configurationService.expressPort); }Para obtener más información, lea la documentación sobre el uso de la configuración en su main.ts
La solución más fácil es simplemente importar dotenv e inicializarlo inmediatamente después. Es particularmente importante que estas sean las dos primeras cosas que haga en sus main.ts, así:
import * as dotenv from 'dotenv'; dotenv.config(); import ... ... async function bootstrap(){ ... }No se necesita ningún módulo de configuración para acceder a las variables en un archivo .env después de hacer eso.