Hvordan lagre Node.js distribusjonsinnstillinger/konfigurasjonsfiler?

Jeg har jobbet med noen Node-apper, og jeg har lett etter et godt mønster for lagring av distribusjonsrelaterte innstillinger. I Django-verdenen (der jeg kommer fra) vil den vanlige praksisen være å ha en settings.py fil som inneholder standardinnstillingene (tidssone osv.), Og deretter en local_settings.py for distribusjonsspesifikke innstillinger, dvs. hvilken database du skal snakke med, hvilken memcache-socket, e-postadresse for administratorene og så videre.

Jeg har lett etter lignende mønstre for Node. Bare en konfigurasjonsfil ville være fint, slik at den ikke trenger å bli fastkjørt sammen med alt annet i app.js, men jeg synes det er viktig å ha en måte å ha serverspesifikk konfigurasjon i en fil som ikke er i kildekontroll. Den samme appen kan godt distribueres på forskjellige servere med veldig forskjellige innstillinger, og å måtte håndtere flettekonflikter og alt det er ikke min idé om moro.

Så finnes det et slags rammeverk/verktøy for dette, eller må alle bare hacke sammen noe selv?

Jeg bruker en package.json for pakkene mine og en config.js for konfigurasjonen min, som ser ut som:

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;

Jeg laster inn konfigurasjonen fra prosjektet mitt:

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

og så kan jeg få tilgang til tingene mine fra config.db_host, config.db_port, etc.... Dette lar meg enten bruke hardkodede parametere, eller parametere lagret i miljøvariabler hvis jeg ikke vil lagre passord i kildekontrollen.

Jeg genererer også en pakke.json og setter inn en avhengighetsseksjon:

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

Når jeg kloner prosjektet til min lokale maskin, kjører jeg npm install for å installere pakkene. Mer info om det her.

Prosjektet er lagret i GitHub, med fjernkontroller lagt til for produksjonsserveren min.

Kommentarer (18)
Løsning

Mye senere fant jeg en ganske god Node.js-modul for å administrere konfigurasjon: nconf.

Et enkelt eksempel:

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

Det støtter også lagring av innstillinger i Redis, skrive konfigurasjonsfiler, og har en ganske solid API, og er også støttet av en av de mer respekterte Node.js butikker, Nodejitsu, som en del av Flatiron rammeverk initiativ, så det bør være ganske fremtidsrettet.

Sjekk ut nconf på Github.

Kommentarer (15)

Du kan også se på node-config som laster inn konfigurasjonsfilen avhengig av variablene $HOST og __$NODE_ENV__ (litt som RoR): documentation.

Dette kan være ganske nyttig for forskjellige distribusjonsinnstillinger (utvikling, test eller produksjon).

Kommentarer (0)