Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Configuración por ambientes

10/17
Recursos
// .stag.env
DATABASE_NAME=my_db_stag
API_KEY=333
// .prod.env
DATABASE_NAME=my_db_prod
API_KEY=999
// src/enviroments.ts
export const enviroments = {
  dev: '.env',
  stag: '.stag.env',
  prod: '.prod.env',
};
// src/app.module.ts
...

import { enviroments } from './enviroments'; // 👈

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: enviroments[process.env.NODE_ENV] || '.env', // 👈
      isGlobal: true,
    }),
    ...
  ],
  ...
})
export class AppModule {}
// src/app.service.ts
import { ConfigService } from '@nestjs/config'; // 👈

@Injectable()
export class AppService {
  constructor(
    @Inject('TASKS') private tasks: any[],
    private config: ConfigService,  // 👈
  ) {}
  getHello(): string {
    const apiKey = this.config.get<string>('API_KEY');  // 👈
    const name = this.config.get('DATABASE_NAME');  // 👈
    return `Hello World! ${apiKey} ${name}`;
  }
}

Rin with NODE_ENV // 👈
NODE_ENV=prod npm run start:dev
NODE_ENV=stag npm run start:dev

Aportes 16

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Los entornos de desarrollo si me estan funcionando

Desarrollo:

Producción:

Stag:

Apuntes

Crear archivos env para los distintos ambientes

Ya que configuramos el archivo env que contiene el valor de las variables de entorno para el servidor de desarrollo debemos crear los archivos .env para el servidor de pruebas y produccion.

// .stag.env
DATABASE_NAME=my_db_stag
API_KEY=333

// .prod.env
DATABASE_NAME=my_db_prod
API_KEY=999

¿Cómo elegir dinámicamente el archivo env?

Nuestro código debe elegir automáticamente que archivo .env debe tomar según en el servidor en el que se este ejecutando. Para ello debemos crear un objeto en donde listaremos todos los ambientes que existen y los ligaremos con su archivo correspondiente.

// src/enviroments.ts
export const enviroments = {
  dev: '.env',
  stag: '.stag.env',
  prod: '.prod.env',
};

Ahora solo debemos agregar la linea mágica para que el archivo .env correspondiente se inyecte en el código.

// src/app.module.ts
...

import { enviroments } from './enviroments'; // 👈

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: enviroments[process.env.NODE_ENV] || '.env', // 👈
      isGlobal: true,
    }),
    ...
  ],
  ...
})
export class AppModule {}

Llamar a las variables de entorno

Listo, ahora solo debemos preocuparnos por obtener las variables de entorno.

// src/app.service.ts
import { ConfigService } from '@nestjs/config'; // 👈

@Injectable()
export class AppService {
  constructor(
    @Inject('TASKS') private tasks: any[],
    private config: ConfigService,  // 👈
  ) {}
  getHello(): string {
    const apiKey = this.config.get<string>('API_KEY');  // 👈
    const name = this.config.get('DATABASE_NAME');  // 👈
    return `Hello World! ${apiKey} ${name}`;
  }
}

Especificar ambiente

Podemos indicar en que ambiente se esta trabajando usando las siguientes lineas.

NODE_ENV=prod npm run start:dev
NODE_ENV=stag npm run start:dev

Si estas usando el powershell de windos

$env:NODE_ENV="prod"; npm run start:dev
$env:NODE_ENV="stag"; npm run start:dev
$env:NODE_ENV="dev"; npm run start:dev

Para establecer la variable de entorno en Windows Terminal u otro semejante diferente a linux:

$env:NODE_ENV="dev"
$env:NODE_ENV="stag"
$env:NODE_ENV="prod"

En mi caso, ejecutando en windows, para asignar la variable de entorno al ejecutar hago lo siguiente:

>set NODE_ENV=stag&& npm run start:dev

Ojo que se escribe environments y no enviroment (falto una “n”)
Saludos!

Lo correcto seria mandar esas configuraciones aun modulo propio.

En mi caso puse el NODE_ENV=dev en el script de start:dev quedandome

"start:dev":"cross-env NODE_ENV=dev nest start --watch"

cross-env es una dependencia que me permite declarar variables desde la consola de windows

En caso tal estés usando docker compose para correr tu proyecto y tienes problemas con el cambio de ambiente, revisa la opción env_file. Si estás pasando determinado archivo en esa opción, tomará siempre esas variables de entorno.

Hola, de acuerdo a twelve-factor (https://12factor.net/config) es preferible no agrupar configuraciones en distintos grupos (archivos o entornos), porque esto resulta en una app que “no es fácilmente escalable y la cantidad de archivos de configuración crecerá a través de los diferentes despliegues de la misma a medida que la app vaya creciendo”.
.
Así que sugieren usar el mismo archivo (.env por ejemplo) y ya cada despliegue se encarga de configurar sus variables de acuerdo a lo que necesita ese despliegue en particular.
.
¿Qué opinan al respecto de lo que se plantea en twelve-factor? ¿Sería mejor tener una única fuente de configuración pero que cambie su contenido a través de diferentes despliegues? ¿Es mejor manejar diferentes archivos así estos se incluyan o no en los diferentes despliegues de la aplicación?
.
Por mi parte pienso que es mejor tener un único archivo .env y cuando lo pase al servidor de producción pués solo se cambiaría el contenido del mismo.

esa config del enviroments como object se llama hash table y les dejo este post muy util si quieren reforzar este conocimiento.

Entorno Staging:

Entorno Production:

Excelente aporte, se que el curso es de nest pero trataré de implentarlo con node y express, esto es una muy buena practica de desarrollo

Hola 👋
Aqui mis resultados 😀

.env

.prod.env

.stag.env

👏

Todo funcionando!!! 😄