¿Cómo almacenar los archivos de configuración/ajustes de implementación de Node.js?
He estado trabajando en algunas aplicaciones de Node y he estado buscando un buen patrón para almacenar configuraciones relacionadas con la implementación. En el mundo Django (de donde vengo), la práctica común sería tener un settings.py
archivo que contenga la configuración estándar (zona horaria, etc.), y luego una local_settings.py
configuración específica para la implementación, es decir. con qué base de datos hablar, qué socket de Memcache, dirección de correo electrónico de los administradores, etc.
He estado buscando patrones similares para Node. Solo un archivo de configuración sería bueno, por lo que no tiene que estar intercalado con todo lo demás en app.js
, pero encuentro importante tener una manera de tener una configuración específica del servidor en un archivo que no está en el control de código fuente. La misma aplicación bien podría implementarse 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.
Entonces, ¿existe algún tipo de marco/herramienta para esto, o todos simplemente piratean algo por sí mismos?
Utilizo a package.json
para mis paquetes y a config.js
para mi configuración, que se ve así:
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 usar parámetros codificados o parámetros almacenados en variables ambientales si no quiero almacenar contraseñas en el control de fuente.
También genero 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, lo ejecuto npm install
para instalar los paquetes. Más información sobre eso aquí .
El proyecto se almacena en GitHub y se agregaron controles remotos para mi servidor de producción.
Puede requerir archivos JSON a partir de Node v0.5.x ( haciendo referencia a esta respuesta )
config.json:
{
"username" : "root",
"password" : "foot"
}
aplicación.js:
var config = require('./config.json');
log_in(config.username, config.password);
Mucho más tarde, encontré un módulo 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 admite el almacenamiento de configuraciones en Redis , la escritura de archivos de configuración y tiene una API bastante sólida, y también está respaldado por una de las tiendas Node.js más respetadas, Nodejitsu , como parte de la iniciativa del marco Flatiron , por lo que debería ser bastante preparado para el futuro.
Consulte nconf en Github .
Mi solución es bastante simple:
Cargue la configuración del entorno en ./config/index.js
var env = process.env.NODE_ENV || 'development'
, cfg = require('./config.'+env);
module.exports = cfg;
Defina algunos valores predeterminados en ./config/config.global.js
var config = module.exports = {};
config.env = 'development';
config.hostname = 'dev.example.com';
//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';
Anule los valores predeterminados en ./config/config.test.js
var config = require('./config.global');
config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';
module.exports = config;
Usándolo en ./models/user.js:
var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);
Ejecutando su aplicación en un entorno de prueba:
NODE_ENV=test node ./app.js
También puedes consultar dotenv , que sigue los principios de una aplicación de doce factores .
Solía usar node-config, pero creé dotenv por ese motivo. Estaba completamente inspirado en la biblioteca dotenv de Ruby.
El uso es bastante fácil:
var dotenv = require('dotenv');
dotenv.load();
Luego simplemente crea un archivo .env y coloca su configuración allí de esta manera:
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name
Eso es dotenv para nodejs.