Ako uložiť nastavenia/konfiguračné súbory nasadenia Node.js?

Pracoval som na niekoľkých aplikáciách Node a hľadal som dobrý vzor na ukladanie nastavení súvisiacich s nasadením. Vo svete Django (odkiaľ pochádzam) je bežnou praxou mať súbor settings.py, ktorý obsahuje štandardné nastavenia (časová zóna atď.), a potom súbor local_settings.py pre špecifické nastavenia nasadenia, t. j. s akou databázou sa má komunikovať, aký soket memcache, e-mailovú adresu pre administrátorov atď.

Podobné vzory som hľadal aj pre Node. Len konfiguračný súbor by bol fajn, aby sa nemusel zasekávať medzi všetko ostatné v app.js, ale považujem za dôležité mať možnosť mať konfiguráciu špecifickú pre server v súbore, ktorý nie je v správe zdrojov. Tá istá aplikácia by mohla byť nasadená na rôznych serveroch s divoko odlišnými nastaveniami a riešiť konflikty pri zlučovaní a podobne nie je moja predstava zábavy.

Existuje na to nejaký framework/nástroj, alebo si každý niečo poskladá sám?

Pre svoje balíky používam súbor package.json a pre konfiguráciu súbor config.js, ktorý vyzerá takto:

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;

Načítam konfiguráciu z môjho projektu:

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

a potom môžem pristupovať k mojim veciam z config.db_host, config.db_port, atď... To mi umožňuje používať buď natvrdo zadané parametre, alebo parametre uložené v premenných prostredia, ak nechcem ukladať heslá v správe zdrojov.

Taktiež generujem súbor package.json a vkladám do neho sekciu závislostí:

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

Keď naklonujem projekt na svoj lokálny počítač, spustím npm install na inštaláciu balíkov. Viac informácií o tom tu.

Projekt je uložený na GitHub, pričom pre môj produkčný server sú pridané vzdialené položky.

Komentáre (18)
Riešenie

Oveľa neskôr som našiel celkom dobrý modul Node.js na správu konfigurácie: nconf.

Jednoduchý príklad:

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

Podporuje tiež ukladanie nastavení v Redis, zápis konfiguračných súborov, má pomerne solídne API a je tiež podporovaný jedným z rešpektovanejších Node.js obchodov, Nodejitsu, ako súčasť iniciatívy Flatiron framework, takže by mal byť pomerne odolný voči budúcnosti.

Pozrite si nconf na Githube.

Komentáre (15)

Môžete sa tiež pozrieť na node-config, ktorý načíta konfiguračný súbor v závislosti od premennej $HOST a __$NODE_ENV__ (trochu ako RoR) : documentation.

To môže byť celkom užitočné pre rôzne nastavenia nasadenia (development, test alebo production).

Komentáre (0)