Gestión de variables de entorno en Node.js con dotenv

La implementación de una aplicación requiere que los desarrolladores piensen y consideren cómo se configura. Muchas aplicaciones se implementan en un entorno de desarrollo porque...

Introducción

La implementación de una aplicación requiere que los desarrolladores piensen y consideren cómo se configura. Muchas aplicaciones se implementan en un entorno de desarrollo antes de implementarse en el entorno de producción. Necesitamos asegurarnos de que cada entorno esté configurado correctamente, podría ser desastroso si nuestra aplicación de producción estuviera usando nuestra base de datos de desarrollo, por ejemplo.

Las variables de entorno nos permiten gestionar la configuración de nuestras aplicaciones de forma independiente a nuestro código base. La separación de configuraciones facilita que nuestra aplicación se implemente en diferentes entornos.

Las aplicaciones grandes tienden a tener muchas variables de entorno. Para gestionarlos mejor podemos utilizar la biblioteca dotenv, que nos permite cargar variables de entorno desde un archivo.

¿Qué son las variables de entorno?

De la programación sabemos que las variables son valores almacenados que se pueden cambiar. Son mutables y pueden variar, de ahí el nombre variables.

Las variables de entorno son variables externas a nuestra aplicación que residen en el sistema operativo o en el que se ejecuta el contenedor de la aplicación. Una variable de entorno es simplemente un nombre asignado a un valor.

Por convención, el nombre se escribe con mayúscula, p. [correo electrónico protegido]. Los valores son cadenas.

Si abre la aplicación de línea de comando o terminal en Linux, Mac OS o Windows e ingresa set, verá una lista de todas las variables de entorno para su usuario.

¿Por qué usar variables de entorno? {#por qué usar variables de entorno}

Las variables de entorno son excelentes para desacoplar configuraciones de aplicaciones. Por lo general, nuestras aplicaciones requieren que se configuren muchas variables para que funcionen. Al basarse en configuraciones externas, su aplicación se puede implementar fácilmente en diferentes entornos. Estos cambios son independientes de los cambios de código, por lo que no requieren que su aplicación se reconstruya para cambiar.

Los datos que cambian según el entorno en el que se ejecuta su aplicación deben configurarse como variables de entorno. Algunos ejemplos comunes son:

  • Puerto HTTP y dirección
  • Base de datos, caché y otra información de conexión de almacenamiento
  • Ubicación de archivos/carpetas estáticas
  • Puntos finales de servicios externos
    • For example, on a development environment your app will point to a test API URL, whereas in a production environment your app will point to the live API URL.

Los datos confidenciales, como las claves API, no deben estar en el código fuente ni ser conocidos por personas que no necesitan acceso a esos servicios externos.

Variables de entorno en Node.js

Considere una aplicación hello world Nodo.js con variables de entorno para el host y el puerto en el que se ejecuta la aplicación.

Cree un nuevo archivo llamado hello.js en un espacio de trabajo de su elección y agregue lo siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const http = require('http');

// Read the host address and the port from the environment
const hostname = process.env.HOST;
const port = process.env.PORT;

// Return JSON regardless of HTTP method or route our web app is reached by
const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.end(`{"message": "Hello World"}`);
});

// Start a TCP server listening for connections on the given port and host
server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});

Node.js proporciona una variable global process.env, un objeto que contiene todas las variables de entorno disponibles para el usuario que ejecuta la aplicación. Espera que el entorno defina el nombre de host y el puerto en el que se ejecutará la aplicación.

Puede ejecutar esta aplicación ingresando este comando en la terminal, HOST=localhost PORT=3000 node hello.js, dado que tiene instalado Node.js. Notará el siguiente mensaje en su consola:

1
Server running at http://localhost:3000/

Crear y leer variables de entorno es así de fácil. Digamos que estamos escribiendo un microservicio que se comunica con una instancia mysql y redis, nos gustaría para tener los detalles de conexión disponibles en nuestras variables de entorno también.

Podríamos terminar con un comando como este:

1
$ DB_HOST=localhost DB_PORT=3306 DB_USER=test DB_PASSWORD=verySecret123!$ DB_MAX_CONNECTIONS=15 CACHE_ADDR=localhost CACHE_PORT= 6379 HOST=localhost PORT=3000 node hello.js

Desarrollar con múltiples variables de entorno rápidamente se vuelve difícil de manejar. Sería mejor si las variables de entorno que tuviéramos que configurar se almacenaran en un lugar central de la aplicación, como un archivo.

La biblioteca dotenv

Esta biblioteca realiza una tarea simple: carga variables de entorno desde un archivo .env en la variable process.env en Node.js. Usemos dotenv para el ejemplo anterior.

Primero, necesitamos instalarlo a través de npm:

1
2
$ npm init # Optional, creates a local package.json that prevents global installs
$ npm install dotenv --save

Y luego hacemos un cambio de código mínimo, agregamos esta línea en la parte superior de hello.js:

1
require('dotenv').config()

Ahora, en el mismo directorio de su aplicación, cree un nuevo archivo llamado .env y agregue lo siguiente:

1
2
HOST=localhost
PORT=3000

Sus variables de entorno se declaran como si las estuviera ingresando en el shell antes de ejecutar el comando de nodo. En lugar de separar cada asignación de variable por un espacio, las separamos por un nueva línea. Ahora en su shell, si ingresa node hello.js, ¡la aplicación se ejecutará en el puerto 3000 en su localhost!

Incluso si se usa dotenv en la aplicación, es completamente opcional. Si no se encuentra ningún archivo .env, la biblioteca falla silenciosamente. Puede continuar usando variables de entorno definidas fuera del archivo.

Nota: También hay muchas variaciones de dotenv en otros lenguajes y marcos de programación. Una guía muy popular para crear aplicaciones web modernas es La aplicación de doce factores. El documento fue creado por muchos desarrolladores que crearon aplicaciones de software como servicio. Una de las 12 consideraciones de una aplicación moderna y escalable es la configuración, específicamente el uso de variables de entorno para almacenar la configuración. La popularidad de esta metodología ha ayudado a impulsar la creación y popularidad de dotenv y módulos similares.

Uso de producción

Almacenar sus variables de entorno en un archivo viene con una regla de oro: nunca lo confirme en el repositorio de código fuente. No desea que personas ajenas obtengan acceso a secretos, como claves API. Si está utilizando dotenv para ayudar a administrar sus variables de entorno, asegúrese de incluir el archivo .env en su .gitignore o la lista negra apropiada para su herramienta de control de versiones.

Si no puede confirmar el archivo .env, entonces debe haber alguna forma para que un desarrollador sepa qué variables de entorno se requieren para ejecutar el software. Es común que los desarrolladores enumeren las variables de entorno necesarias para ejecutar el programa en un ‘README’ o documentación interna similar.

Algunos desarrolladores crean y mantienen un archivo .sample-env en el repositorio del código fuente. Este archivo de muestra enumeraría todas las variables de entorno utilizadas por la aplicación, por ejemplo:

1
2
HOST=
PORT=

Luego, un desarrollador clonaría el repositorio, copiaría el archivo .sample-env en un nuevo archivo .env y completaría los valores.

Si su aplicación se ejecuta en una máquina física o virtual (por ejemplo, Gotas del océano digital, [Amazonas EC2](https://aws .amazon.com/ec2/) y Máquinas virtuales de Azure), luego puede crear un .env mientras está conectado en el servidor y se ejecutaría tal como se hace en su máquina local.

Si su aplicación se ejecuta en un contenedor docker o en un proveedor de plataforma como servicio como Heroku o [turno abierto](https://www.openshift.com /), entonces podrá configurar las variables de entorno sin tener que usar el archivo .env.

Recuerde, falla silenciosamente, por lo que no afectaría el funcionamiento de la aplicación si falta el archivo.

Conclusión

Las variables de entorno existen fuera del código de nuestra aplicación, están disponibles donde se ejecuta nuestra aplicación. Se pueden usar para desacoplar la configuración de nuestra aplicación de su código, lo que permite que nuestras aplicaciones se implementen fácilmente en diferentes entornos.

Con las aplicaciones de Node.js, las variables de entorno están disponibles a través de la variable global process.env. Podemos configurar las variables de entorno antes de ejecutar el comando node, o podemos usar la biblioteca dotenv que nos permite definir nuestras variables de entorno en un archivo .env.

El archivo .env nunca debe estar en el repositorio del código fuente.