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 鈥渘鈥)
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 鈥渘o 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!!! 馃槃