714 votes

Comment stocker les paramètres de déploiement / fichiers de configuration de Node.js?

J'ai travaillé sur quelques Nœud applications, et j'ai été à la recherche d'un bon modèle de stockage liées au déploiement des paramètres. Dans le Django monde (d'où je viens), la commune pratique serait d'avoir un settings.py le fichier contenant les paramètres standard (fuseau horaire, etc), et puis un local_settings.py pour le déploiement des paramètres spécifiques, c'est à dire. la base de données, de parler, ce que memcache socket, e-mail aux admins et ainsi de suite.

J'ai été à la recherche pour des modèles similaires pour le Nœud. Juste un fichier de config serait bien, donc il n'a pas à être coincé dans tout le reste en app.js, mais je trouve qu'il est important d'avoir un moyen d'avoir le serveur de configuration spécifiques à un fichier qui n'est pas dans le contrôle de source. La même application peut ainsi être déployé sur des serveurs différents sauvagement avec des paramètres différents, et d'avoir à traiter avec des conflits de fusion et de tout ce qui n'est pas mon idée de plaisir.

Donc, il y a une sorte de cadre/pour cela l'outil, ou tout le monde juste pirater quelque chose d'eux-mêmes?

836voto

noli Points 5625

J'utilise un config.js pour ma configuration, et un paquet.json pour mes colis.

Mon config.js ressemble

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;

Ensuite, je charge ma config de mon projet, comme:

var config = require('./config')

et puis je peux accéder à mes choses de config.db_host, config.db_port, etc.. Cela me permet d'utiliser soit codé en dur des paramètres ou des paramètres stockés dans des variables environnementales, si je ne veux pas stocker les mots de passe de contrôle de source.

J'ai également générer un paquet.json, et insérer une section des dépendances

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

pour installer les paquets que je puis exécutez

npm link

quand je clone mon projet à ma machine locale. Info ici http://nodetuts.com/tutorials/22-freezing-and-bundling-your-dependencies-with-node-04.html#video et ici: http://howtonode.org/introduction-to-npm

Oh, le projet est stocké dans github, avec télécommandes ajoutée pour mon serveur de production.

269voto

TinyTimZamboni Points 940

Vous pouvez demander des fichiers JSON à partir du nœud v0.5.x (référençant cette réponse)

config.JSON :

App.js :

218voto

mikl Points 5906

Beaucoup plus tard, j'ai trouvé une assez bonne Node.js module de gestion de configuration: nconf.

Un exemple simple:

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

Il prend également en charge le stockage de paramètres dans le Redis, écriture des fichiers de configuration, et a une assez bonne API, et est également soutenue par l'un des plus respectés Node.js boutiques, Nodejitsu, dans le cadre de la Flatiron cadre de l'initiative, de sorte qu'il devrait être assez à l'avenir.

Découvrez nconf sur Github.

110voto

chovy Points 8012

Ma solution est assez simple:

Charger l'environnement de config ./config/index.js

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

Définir des valeurs par défaut ./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';

Remplacer les valeurs par défaut ./config/config.test.js

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

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

À l'aide de ./models/user.js:

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

L'exécution de votre application dans l'environnement de test:

NODE_ENV=test node ./app.js

Ceci est expliqué plus en détail ici: http://www.chovy.com/node-js/managing-config-variables-inside-a-node-js-application/

27voto

ngryman Points 611

Vous pourriez aussi regarder à nœud-config qui charge le fichier de configuration selon la variable $HOST et $NODE_ENV (un peu comme RoR) : documentation.

Cela peut être très utile pour les paramètres de déploiement différentes ( , ou `` ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X