Los entornos de desarrollo si me estan funcionando
Desarrollo:
Producción:
Stag:
Módulos de NestJS
¿Ya tomaste el Curso de Backend con NestJS?
Overview del proyecto: PlatziStore
Encapsular lógica en módulos
Interacción entre módulos
Entendiendo la inyección de dependencias
useValue y useClass
useFactory
Global Module
Configuración de entornos
Módulo de configuración
Configuración por ambientes
Tipado en config
Validación de esquemas en .envs con Joi
Documentación
Integrando Swagger y PartialType con Open API
Extendiendo la documentación
Deploy
Configuración de Heroku
Deploy de NestJS en Heroku
Próximos pasos
Continúa con los cursos de persistencia de datos en NestJS
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
// .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
Los entornos de desarrollo si me estan funcionando
Desarrollo:
Producción:
Stag:
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
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 {}
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}`;
}
}
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!!! 😄
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.