Come memorizzare le impostazioni di distribuzione di Node.js e i file di configurazione?

Sto lavorando su alcune applicazioni Node, e sto cercando un buon modello di memorizzazione delle impostazioni relative alla distribuzione. Nel mondo Django (da dove vengo), la pratica comune sarebbe quella di avere un file settings.py contenente le impostazioni standard (fuso orario, ecc), e poi un local_settings.py per le impostazioni specifiche di distribuzione, cioè con quale database parlare, quale socket memcache, indirizzo e-mail per gli amministratori e così via.

Ho cercato modelli simili per Node. Solo un file di configurazione sarebbe bello, così non deve essere bloccato con tutto il resto in app.js, ma trovo importante avere un modo per avere una configurazione specifica del server in un file che non è nel controllo dei sorgenti. La stessa app potrebbe essere distribuita su diversi server con impostazioni selvaggiamente diverse, e avere a che fare con conflitti di fusione e tutto il resto non è la mia idea di divertimento.

Quindi c'è un qualche tipo di struttura/strumento per questo, o ognuno fa qualcosa da solo?

Uso un package.json per i miei pacchetti e un config.js per la mia configurazione, che assomiglia:

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;

Carico la configurazione dal mio progetto:

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

e poi posso accedere alle mie cose da config.db_host, config.db_port, ecc. Questo mi permette di utilizzare parametri hardcoded, o parametri memorizzati in variabili ambientali se non voglio memorizzare le password nel controllo delle fonti.

Genero anche un package.json e inserisco una sezione di dipendenze:

"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"
}

Quando clono il progetto sulla mia macchina locale, eseguo npm install per installare i pacchetti. Maggiori informazioni su questo qui.

Il progetto è memorizzato in GitHub, con i telecomandi aggiunti per il mio server di produzione.

Commentari (18)
Soluzione

Molto più tardi, ho trovato un modulo Node.js abbastanza buono per gestire la configurazione: nconf.

Un semplice esempio:

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'));

Supporta anche la memorizzazione delle impostazioni in Redis, la scrittura di file di configurazione, e ha un'API abbastanza solida, ed è anche sostenuta da uno dei negozi Node.js più rispettati, Nodejitsu, come parte dell'iniziativa del framework Flatiron, quindi dovrebbe essere abbastanza a prova di futuro.

Controlla nconf su Github.

Commentari (15)

Si potrebbe anche guardare a node-config che carica il file di configurazione a seconda delle variabili $HOST e __$NODE_ENV__ (un po' come RoR): documentation.

Questo può essere abbastanza utile per diverse impostazioni di distribuzione (sviluppo, test o produzione).

Commentari (0)