Gestión de variables de entorno NodeJS

  • Por
Cómo realizar un mantenimiento ágil de variables de entorno en aplicaciones NodeJS, para producción y desarrollo, manteniendo sus valores en un archivo independiente.

Es normal que en una aplicación NodeJS mantengamos variables de entorno con valores diferentes cuando estamos en desarrollo y cuando estamos en producción o en cualquier otro ambiente que tengamos. En este artículo te explicaremos una posible manera de estructurar nuestras variables de entorno, en grupos, de modo que las podamos cambiar todas de una única vez dependiendo de si estamos en Producción, Desarrollo, Test, etc.

En un artículo anterior ya explicamos cómo realizar la gestión básica de variables de entorno en NodeJS, tanto su acceso desde un script como su definición en el sistema que va a ejecutarlo. Ahora vamos a profundizar un poco sobre esta necesidad básica de los programas, explicando una posible implementación sencilla de usar y bastante versátil.

La idea o el objetivo que perseguimos en esta práctica es doble:

  1. Que no necesitemos especificar toda la lista de variables de entorno posibles al ejecutar un programa, sino simplemente informar si estamos en desarrollo, producción, test, etc.
  2. Que podamos mantener todas las variables de entorno en un archivo de texto, de modo que podamos editarlo cómodamente como cualquier otro archivo de código de la aplicación.
Nota: Como hemos dicho, vamos a mantener las cosas sencillas, pero aumentar por nuestra cuenta la versatilidad de un script, para que se pueda ejecutar sin cambiar el código fuente en diversos ambientes. Si ya queremos mejorar las prestaciones y disponer de otras funcionalidades es interesante comentar que existen librerías completas para la gestión de variables de entorno como es el caso de https://github.com/indexzero/nconf

En la implementación que vamos a realizar podremos cambiar todo el conjunto de variables de entorno de una única vez, diciendo al ejecutar la aplicación si estamos en desarrollo o producción.

Por ejemplo, para usar el conjunto de variables de entorno predeterminado, que podrían ser los valores necesarios en la etapa de desarrollo, podríamos ejecutar nuestra aplicación sin definir ninguna variable de entorno:

node group-env.js

Si luego queremos ejecutar esta aplicación con los valores de todas las variables de entorno necesarias para producción, entonces tendríamos que ejecutar la aplicación indicando que estamos en el entorno de producción:

NODE_ENV=production node group-env.js
Nota: NODE_ENV es un nombre de variable de entorno habitual. Lo usaremos en nuestro programa también, aunque tú podrás usar el nombre de variable de entorno que desees, siempre que en tu código cuando vayas a traerte esa variable lo hagas con el nombre que estés usando.

Definición de las variables de entorno en un JSON

Podemos usar un literal de objeto Javascript (JSON) escrito en un archivo independiente para mantener todas nuestras variables de entorno. La clave aquí es que vamos a definir diversos conjuntos de variables de entorno.

{
  "development": {
    "SERVERURL": "http://localhost:3001/",
    "PORT": 3001
  },
  "production": {
    "SERVERURL": "https://app.desarrolloweb.com/",
    "PORT": 5000
  }
}

Este código lo colocaremos en un archivo a parte, que requeriremos cuando sea necesario. El nombre del archivo es indiferente, en nuestro caso lo hemos guardado dentro de "env.variables.json".

Tenemos dos conjuntos de valores de entorno, "development" y "production", pero tú podrás tener tantos como necesites y por supuesto, también tendrás tantas variables de entorno como requieras y no solamente PORT y SERVERURL como en el JSON anterior.

Require de las variables de entorno

En todo lugar donde necesitemos acceder a las variables de entorno haremos el correspondiente require del JSON anterior.

var envJSON = require('./env.variables.json');

El el caso anterior, todos los posibles juegos de variables de entorno se volcarán en un objeto al que hemos nombrado envJSON.

Ya solo nos queda definir qué conjunto de variables vamos a usar, para lo que vamos a recibir un única variable de entorno "NODE_ENV". Además, si no se encuentra esa variable vamos a especificar que su valor sea "development".

var node_env = process.env.NODE_ENV || 'development';

Con esa variable de entorno podemos tomar los valores necesarios del JSON, por ejemplo:

var TodasMisVariablesDeEntorno = envJSON[node_env];

Y si queremos acceder a una única variable de entorno, podríamos hacer algo como esto:

var puerto = envJSON[node_env].PORT;

Definir un module para la gestión de variables de entorno

Si queremos ir un poco más allá, podríamos definir el acceso a las variables de entorno en un módulo aparte, de modo que siempre que las necesitamos sea solo realizar el require de ese módulo de configuración.

El código de nuestro módulo podría ser algo como esto: (lo hemos colocado en un archivo config-module.js, pero podrías usar cualquier nombre que quieras)

exports.config = function() {
  var envJSON = require('./env.variables.json');
  var node_env = process.env.NODE_ENV || 'development';
  return envJSON[node_env];
}

Ahora, para acceder a las variables de entorno hacemos el require del módulo anterior (y ejecutamos la función que nos exporta, llamada config) que realiza el acceso al grupo de valores de entorno que necesitamos en cada caso.

var entorno = require('./config-module.js').config()

Esperamos que esta segunda aproximación al tratamiento de variables de entorno sea de tu agrado y la puedas implementar fácilmente en tus aplicaciones NodeJS.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir