A medida que tu aplicación crezca, puedes llegar a necesitar decenas de variables de entorno. Variables que cambian de valor dependiendo si estás en un entorno de desarrollo, de pruebas o de producción.
Variables de entorno en NestJS
El manejo de variables de entorno en NestJS se realiza de una forma muy sencilla. Instala la dependencia @nestjs/config e importa el módulo ConfigModule en el módulo principal de tu aplicación.
El archivo que almacena las variables de entorno suele llamarse .env. Créalo en la raíz de tu proyecto con las variables que necesitas.
API_KEY=1324567890API_SECRET=ABCDEFGHI
De esta manera, las variables de entorno estarán disponibles en tu aplicación y utilizando el objeto global de NodeJS llamado process puedes acceder a estos valores de la siguiente manera:
process.env.API_KEYprocess.env.API_SECRET
Consejos sobre las variables de entorno
Es muy importante NO VERSIONAR el archivo .env en el repositorio de tu proyecto. No guardes las claves secretas de tu aplicación en GIT.
Para asegurar esto, agrega el archivo .env a la configuración del archivo .gitignore para que no sea reconocido por Git y este no lo guarde en el repositorio.
Lo que puedes hacer es crear un archivo llamado .env.example que contendrá un modelo de las variables de entorno que tu aplicación necesita, pero no sus valores.
API_KEY=API_SECRET=
De este modo, cuidas tu aplicación y guardas un archivo para que cualquier desarrollador que tome el proyecto, sepa qué variables necesita configurar para el funcionamiento de la misma.
Cuadro de código para usar el módulo de configuración
Hola chicos, les quiero he notado que en la comunidad utilizando mucho los console logs para debugear, cosa que no esta mal, pero existe el debuguer de vscode que es muy bueno y pueden aprovechar el uso de los breakpoints como la consola del debuguer. Aca les dejo un link para que puedan levantar sus procesos con el debuguer del vscode. Cualquier duda, avisenme https://code.visualstudio.com/docs/nodejs/nodejs-debugging#_auto-attach-feature
estoy intentando pero no me deja :(
tienes que usar el modulo de Logger de NEST
Como dice el profesor, no es buena practica trackear el archivo .env, pero también es buena práctica tener un archivo .env.example que ese sí se trackea. El archivo .env.example sirve para informar qué variables de entorno el proyecto necesita (sin valores, sólo cuales son) para que personas que quieran bajarlo y correlo sepan cuales agregar.
Así es, por lo general se dejan en blanco variables delicadas como api keys, y los demás si se deja lleno
Apuntes
Introducción
El valor de las variables de entorno (las variables de entorno son variables globales que se usan en toda la aplicación) depende de si la aplicación se ejecutara en el servidor de producción, en el de pruebas o en una versión local.
Instalación
Para manejar las variables de entorno instalaremos el modulo config propio de nest js.
npm i --save @nestjs/config
Declaración de variables entorno
Debemos listar todas las variables de entorno en un archivo llamado .env en la raíz del proyecto.
// .env
DATABASE_NAME=my_db
API_KEY='1234'
No olvides agregar este archivo en lista de los ignore de git
// .gitignore
*.env
// src/users/services/users.service.tsimport{ConfigService}from'@nestjs/config';...@Injectable()exportclassUsersService{constructor(privateproductsService:ProductsService,privateconfigService:ConfigService,// 👈 inject ConfigService){}...findAll(){const apiKey =this.configService.get('API_KEY');// 👈 get API_KEYconst dbName =this.configService.get('DATABASE_NAME');// 👈 get DATABASE_NAMEconsole.log(apiKey, dbName);returnthis.users;}...}
Disculpa , en algun lado tenes todos los apuntes del curso , si me podes pasar seria buenisimo . Gracias
Claro, con mucho gusto te comparto mis apuntes. Los hice en notion.
Apuntes nest modular.
Espero te sean útiles amigo.
Hola 👋
Ya que no se sube el archivo .env a nuestro repositorio ni se trackea, es importante dar una documentacion de que se tiene alli pero sin especificar sus valores.
Para ellos cambiamos un poco la especificacion del .gitignore para no ignore todos los archivos terminados en .env sino solo .env
// .gitignore# Enviroments*.env!.example.env
Y agregamos a la raiz un example.env donde iran las mismas variables pero sin su respectivo valor
API_KEY=DATABASE_NAME=
Espero haberles aportado algo 🚀
Si como yo, están usando el repo del curso con Nest en versión 7, seguramente tendrán que hacer
npm i @nestjs/config@0.6.3--legacy-peer-deps
Para que les funcione esta configuración
A quien le pueda servir, tuve un problema al instalar @nestjs/config, me aparecia que ConfigModule no existia en @nestjs/config. Lo solucioné reemplazando en el package.json.
Esto:
"@nestjs/config":"github:nestjs/config",
Por esto:
"@nestjs/config":"^2.0.0"
Me paso esto, y creo que fue porque me equivoque instale npm i nestjs/config sin el @ , borre el paquete , hice npm i , y lo instale con el @ es decir: npm i @nestjs/config y se instalo correctamente .
Por si alguien en algún momento debe de hacer un Testing con el configModule acá esta un ejemplo, lo pongo con un guardian porque es común usar las variables de entorno para validar que un usuario haga un request con un api key adecuado y para verificar puede sacar los apikeys de las variables de entorno. Espero que les sea útil.
profe, con esto ya puedo ser google developer expert? :( jaja
Creo que faltan dos clases mas
Hola chicos, pego las variables de entorno que tengo en un proyecto personal que estoy desarrollando, que se conecta a una base de datos y usa tokens JWT
Esto está mejor que los módulos globales @Global(), creo? =D
A mi no me carga la variable me dice que undefined
vale si de esta forma podemos acceder a muchas variables sin tener que inject una a una, cual seria un verdadero caso de uso o como seria un correcto uso para el useValue? es que ya me confundi un poco en esto ya que pues este deniega o es mucho mas util, practico y hasta seguro que el useValue
Correcto no es buena práctica inyectar uno a uno, no es muy mantenible, en cuanto a useValue se puede usar de muchas formas según veas la necesidad, por ejemplo algunos casos:
Una instancia global de un servicio externo como Sentry, S3 de Amazon o hasta la instancia de una conexión a DB (esto lo usamos en el curso de TypeORM) etc.
Es muy útil a la hora de hacer testing, ya que puede remplazar cualquier valor con un mock.
¿Sería lo mismo usar este ConfigService para obtener los environments que usar process.env.XXX?
Hola, una pregunta: como se podria leer una variable (mongoDbConnection) en el module (en el caso de conexion a DB )
Compañero!
Para estos casos podrías utilizar variables de entorno. Te recomiendo que veas esta documentación de NestJS para saber cómo leer los archivos .env y utilizar process.env.XXX para leer variables de entorno en donde necesites.
Saludos!
Si la variables de entorno no las subes al repositorio ¿Cómo haces para que los demás miembros de tu equipo sepan que variables existen? ¿Solo se informa a través de correos?
Hola Jimmy
Sé que no es la respuesta que esperas pero se comparten de otras formas.
¿Cuáles? Bueno eso dependerá del departamento o área de seguridad informática de tu empresa y si no la hay, dependerá del área TI. Los canales de donde fluye la información interna en las empresas son vigilados (o deberían), quizás tengan un hub donde te pasen alguna clave semanalmente o quizás te las proporcionen mediante una app que encripte esa información. Eso ya depende de quien defina las medidas de seguridad del proyecto.
documentación de nestjs sobre module config
Si necesitas las variables de entorno en el app.module puedes crear una instancia, del configService, y usarlo donde necesites
const configService =newConfigService();
Pueden ser trackeados por git, más por buenas practicas nunca deben ir al repositorio.