web-dev-qa-db-fra.com

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, 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 différents environnements - développement/planification/production, car les rappels sont dirigés vers des URL différentes.

Qu. Comment définir ces paramètres dans la configuration environnementale pour qu'ils filtrent à travers tous les modules ou puis-je passer le chemin directement dans le module?

Défini 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'});
});

? espérons que cela a du sens

107
andy t

Ma solution,

charger l'application en utilisant

NODE_ENV=production node app.js

Puis configurez config.js comme une fonction plutôt qu'un objet

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, conformément à la solution Jans, chargez le fichier et créez une nouvelle instance dans laquelle nous pourrons éventuellement transmettre une valeur. 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'objet de configuration exactement comme avant

conf.Twitter.consumerKey
188
andy t

Vous pouvez également avoir un fichier JSON avec NODE_ENV comme niveau supérieur. Messagerie Internet uniquement, c’est un meilleur moyen d’exprimer les paramètres de configuration (par opposition à l’utilisation d’un script qui renvoie les paramètres).

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 } }
    }
}
55
mattwad

Une solution très utile consiste à 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 objet 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 par 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
}

Sur votre PC local, vous pouvez avoir un fichier local =j = qui remplace tout l’environnement, ou une configuration locale spécifique comme local-production.json ou local-development.json .

Le complet liste de l'ordre de chargement .

À l'intérieur de votre application

Dans votre application, vous devez uniquement exiger la configuration et l'attribut requis.

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

Chargez l'application

charger l'application en utilisant:

NODE_ENV=production node app.js

ou définir le bon environnement avec pour toujours 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"
    }
  }]
}

Puis

$ 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/intermédiaire/de développement et pour la configuration locale.

31
Zauker

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 de 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 /, consultez-le pour plus de détails.

12
kris

Une méthode élégante consiste à utiliser le fichier .env pour remplacer les paramètres de production localement. 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 local .env remplace toutes les variables d'environnement. Mais sur les serveurs de transfert ou de production (peut-être qu'ils se trouvent sur heroku.com), les variables d'environnement sont prédéfinies sur stage NODE_ENV=stage ou sur production NODE_ENV=prod.

5
Benxamin

Pour ce faire, nous passons 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 en tant que fichier de configuration. Vous pouvez analyser ces options avec optparse-js .

Vous avez maintenant quelques modules de base qui dépendent de ce fichier de configuration. Quand 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);
5
Jan Jongboom

Pourquoi ne pas le faire de manière beaucoup plus élégante avec le module nodejs-config .

Ce module est capable de définir un environnement de configuration basé sur le nom de votre ordinateur. Après cela, lorsque vous demanderez 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 appelée pc3. Chaque fois que vous demandez des valeurs de configuration dans votre code dans pc1 ou pc2, vous devez obtenir la configuration de l'environnement "développement" et dans pc3, vous devez obtenir la configuration de l'environnement "de production". Ceci peut être réalisé comme ceci:

  1. Créez un fichier de configuration de base dans le répertoire config, disons "app.json" et ajoutons les configurations requises.
  2. Maintenant, créez simplement des dossiers dans le répertoire config qui correspondent à votre nom d’environnement, dans ce cas "développement" et "production".
  3. Créez ensuite les fichiers de configuration que vous souhaitez remplacer et spécifiez les options de chaque environnement dans les répertoires d’environnement (notez que vous n’avez pas besoin de spécifier toutes les options figurant dans le fichier de configuration de base, mais uniquement celles que vous souhaitez écraser. les fichiers de configuration d’environnement seront "mis en cascade" sur les fichiers de base.).

Créez maintenant 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;
3
Harish Anchu