¿Cómo se almacenan los archivos de configuración de Node.js?

He estado trabajando en algunas aplicaciones Node, y he estado buscando un buen patrón para almacenar las configuraciones relacionadas con el despliegue. En el mundo de Django (de donde vengo), la práctica común sería tener un archivo settings.py que contenga las configuraciones estándar (zona horaria, etc), y luego un local_settings.py para las configuraciones específicas del despliegue, es decir, con qué base de datos hablar, qué socket de memcache, dirección de correo electrónico para los administradores y así sucesivamente.

He estado buscando patrones similares para Node. Sólo un archivo de configuración estaría bien, por lo que no tiene que ser atascado con todo lo demás en app.js, pero me parece importante tener una manera de tener la configuración específica del servidor en un archivo que no está en el control de origen. La misma aplicación podría ser desplegada en diferentes servidores con configuraciones muy diferentes, y tener que lidiar con conflictos de fusión y todo eso no es mi idea de diversión.

¿Existe algún tipo de marco/herramienta para esto, o todo el mundo se limita a hackear algo por sí mismo?

Utilizo un package.json para mis paquetes y un config.js para mi configuración, que tiene el aspecto siguiente

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

Cargo la configuración de mi proyecto:

var config = require('./config');

y luego puedo acceder a mis cosas desde config.db_host, config.db_port, etc... Esto me permite utilizar parámetros codificados, o parámetros almacenados en variables de entorno si no quiero almacenar las contraseñas en el control de origen.

También genero un package.json e inserto una sección de dependencias:

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

Cuando clono el proyecto en mi máquina local, ejecuto npm install para instalar los paquetes. Más información al respecto aquí.

El proyecto está almacenado en GitHub, con remotas añadidas para mi servidor de producción.

Comentarios (18)
Solución

Mucho más tarde, encontré un módulo de Node.js bastante bueno para gestionar la configuración: nconf.

Un ejemplo sencillo:

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

También soporta el almacenamiento de configuraciones en Redis, la escritura de archivos de configuración, y tiene una API bastante sólida, y también está respaldada por una de las tiendas más respetadas de Node.js, Nodejitsu, como parte de la iniciativa del marco Flatiron, por lo que debería ser bastante a prueba de futuro.

Echa un vistazo a nconf en Github.

Comentarios (15)

También puede mirar a node-config que carga el archivo de configuración dependiendo de la variable $HOST y __$NODE_ENV__ (un poco como RoR) : documentation.

Esto puede ser bastante útil para diferentes configuraciones de despliegue (desarrollo, prueba o producción).

Comentarios (0)