Node.js mettant en place des configurations spécifiques à l’environnement à utiliser avec everyauth

J’utilise node.js + express.js + everyauth.js. J’ai déplacé toute ma logique everyauth dans un fichier de module

var login = require('./lib/everyauthLogin'); 

à l’intérieur de cela, je charge mon fichier de configuration oAuth avec les combinaisons clé / secret:

 var conf = require('./conf'); ..... twitter: { consumerKey: 'ABC', consumerSecret: '123' } 

Ces codes sont différents pour les différents environnements – développement / mise en scène / production car les rappels concernent différentes URL.

Qu. Comment puis-je définir ces parameters dans la configuration environnementale pour filtrer tous les modules ou puis-je transmettre le chemin directement dans le module?

Set dans env:

 app.configure('development', function(){ app.set('configPath', './confLocal'); }); app.configure('production', function(){ app.set('configPath', './confProduction'); }); var conf = require(app.get('configPath')); 

Passer

 app.configure('production', function(){ var login = require('./lib/everyauthLogin', {configPath: './confProduction'}); }); 

? espoir qui a du sens

Ma solution

charger l’application en utilisant

 NODE_ENV=production node app.js 

Ensuite, configurez config.js comme une fonction plutôt qu’un object

 module.exports = function(){ switch(process.env.NODE_ENV){ case 'development': return {dev setting}; case 'production': return {prod settings}; default: return {error or other settings}; } }; 

Ensuite, selon la solution Jans, chargez le fichier et créez une nouvelle instance que nous pourrions transmettre si nécessaire, dans ce cas, process.env.NODE_ENV est global, donc inutile.

 var Config = require('./conf'), conf = new Config(); 

Ensuite, nous pouvons accéder aux propriétés de l’object de configuration exactement comme avant

 conf.twitter.consumerKey 

Vous pourriez également avoir un fichier JSON avec NODE_ENV comme niveau supérieur. IMO, c’est un meilleur moyen d’exprimer les parameters de configuration (par opposition à l’utilisation d’un script qui renvoie des parameters).

 var config = require('./env.json')[process.env.NODE_ENV || 'development']; 

Exemple pour env.json:

 { "development": { "MONGO_URI": "mongodb://localhost/test", "MONGO_OPTIONS": { "db": { "safe": true } } }, "production": { "MONGO_URI": "mongodb://localhost/production", "MONGO_OPTIONS": { "db": { "safe": true } } } } 

Une solution très utile est d’utiliser le module de configuration .

après avoir installé le module:

 $ npm install config 

Vous pouvez créer un fichier de configuration default.json . (vous pouvez utiliser un object JSON ou JS en utilisant l’extension .json5)

Par exemple

 $ vi config/default.json { "name": "My App Name", "configPath": "/my/default/path", "port": 3000 } 

Cette configuration par défaut peut être remplacée par un fichier de configuration d’environnement ou un fichier de configuration local pour un environnement de développement local:

production.json pourrait être:

 { "configPath": "/my/production/path", "port": 8080 } 

development.json pourrait être:

 { "configPath": "/my/development/path", "port": 8081 } 

Dans votre PC local, vous pourriez avoir un local.json qui remplace tout l’environnement, ou vous pourriez avoir une configuration locale spécifique en tant que local-production.json ou local-development.json .

La liste complète de l’ordre de chargement .

À l’intérieur de votre application

Dans votre application, il vous suffit de demander la configuration et l’atsortingbut requirejs.

 var conf = require('config'); // it loads the right file var login = require('./lib/everyauthLogin', {configPath: conf.get('configPath')); 

Charger l’application

charger l’application en utilisant:

 NODE_ENV=production node app.js 

ou définir l’environnement correct avec forever ou pm2

Pour toujours:

 NODE_ENV=production forever [flags] start app.js [app_flags] 

PM2 (via shell):

 export NODE_ENV=staging pm2 start app.js 

PM2 (via .json):

process.json

 { "apps" : [{ "name": "My App", "script": "worker.js", "env": { "NODE_ENV": "development", }, "env_production" : { "NODE_ENV": "production" } }] } 

Et alors

 $ pm2 start process.json --env production 

Cette solution est très propre et facilite la configuration de différents fichiers de configuration pour l’environnement de production / de stockage / de développement et pour les parameters locaux.

Nous procédons ainsi en passant un argument lors du démarrage de l’application avec l’environnement. Par exemple:

 node app.js -c dev 

Dans app.js, nous chargeons ensuite dev.js comme fichier de configuration. Vous pouvez parsingr ces options avec optparse-js .

Maintenant, vous avez des modules de base qui dépendent de ce fichier de configuration. Lorsque vous les écrivez comme tels:

 var Workspace = module.exports = function(config) { if (config) { // do something; } } (function () { this.methodOnWorkspace = function () { }; }).call(Workspace.prototype); 

Et vous pouvez l’appeler alors dans app.js comme:

 var Workspace = require("workspace"); this.workspace = new Workspace(config); 

En bref

Ce type de configuration est simple et élégant:

env.json

 { "development": { "facebook_app_id": "facebook_dummy_dev_app_id", "facebook_app_secret": "facebook_dummy_dev_app_secret", }, "production": { "facebook_app_id": "facebook_dummy_prod_app_id", "facebook_app_secret": "facebook_dummy_prod_app_secret", } } 

common.js

 var env = require('env.json'); exports.config = function() { var node_env = process.env.NODE_ENV || 'development'; return env[node_env]; }; 

app.js

 var common = require('./routes/common') var config = common.config(); var facebook_app_id = config.facebook_app_id; // do something with facebook_app_id 

Pour exécuter en mode production: $ NODE_ENV=production node app.js


En détail

Cette solution provient de: http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/ plus de détails.

Une manière élégante consiste à utiliser le fichier .env pour remplacer localement les parameters de production. Pas besoin de commutateurs de ligne de commande. Pas besoin de toutes ces virgules et crochets dans un fichier config.json . Voir ma réponse ici

Exemple: sur ma machine, le fichier .env est le suivant:

 NODE_ENV=dev TWITTER_AUTH_TOKEN=something-needed-for-api-calls 

Mon .env local remplace toutes les variables d’environnement. Mais sur les serveurs de transfert ou de production (peut-être qu’ils sont sur heroku.com), les variables d’environnement sont prédéfinies à l’étape NODE_ENV=stage ou production NODE_ENV=prod .

Comment faire cela d’une manière beaucoup plus élégante avec le module nodejs-config .

Ce module est capable de définir l’environnement de configuration en fonction du nom de votre ordinateur. Après cela, lorsque vous demandez une configuration, vous obtiendrez une valeur spécifique à l’environnement.

Par exemple, supposons que vous avez deux machines de développement nommées pc1 et pc2 et une machine de production nommée pc3. Lorsque vous demandez des valeurs de configuration dans votre code dans pc1 ou pc2, vous devez obtenir une configuration de l’environnement de “développement” et dans pc3, vous devez obtenir une configuration de l’environnement de “production”. Cela peut être réalisé comme ceci:

  1. Créez un fichier de configuration de base dans le répertoire config, disons “app.json” et ajoutez-y les configurations requirejses.
  2. Maintenant, créez simplement des dossiers dans le répertoire config correspondant au nom de votre environnement, dans ce cas “développement” et “production”.
  3. Ensuite, créez les fichiers de configuration que vous souhaitez remplacer et spécifiez les options pour chaque environnement dans les répertoires d’environnement (Notez qu’il n’est pas nécessaire de spécifier toutes les options du fichier de configuration de base, mais uniquement les options que vous souhaitez remplacer. Les fichiers de configuration de l’environnement seront “en cascade” sur les fichiers de base.)

Maintenant, créez une nouvelle instance de configuration avec la syntaxe suivante.

 var config = require('nodejs-config')( __dirname, // an absolute path to your applications 'config' directory { development: ["pc1", "pc2"], production: ["pc3"], } ); 

Maintenant, vous pouvez obtenir n’importe quelle valeur de configuration sans vous soucier de l’environnement comme ceci:

 config.get('app').configurationKey;