126 votes

Node.js : mise en place de 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 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 les différents environnements - développement / staging / production, car les rappels se font vers des urls différentes.

Question : Comment les définir dans la configuration de l'environnement pour qu'ils soient filtrés par tous les modules ou puis-je passer le chemin d'accès directement dans le module ?

Fixé dans l'environnement :

app.configure('development', function(){
  app.set('configPath', './confLocal');
});

app.configure('production', function(){
  app.set('configPath', './confProduction');
});

var conf = require(app.get('configPath'));

Entrer

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

? j'espère que cela a du sens

0 votes

J'ai trouvé une solution qui utilise certaines des idées ci-dessous, en ayant le module = fonction plutôt qu'un objet, je peux évaluer process.env.NODE_ENV et retourner l'objet correct pour l'environnement. C'est un peu compliqué mais ça marche.

0 votes

Pardonnez l'autopromotion éhontée, mais j'ai écrit un module pour node.js qui fera cela via des fichiers séparés et un commutateur de ligne de commande : configuration du nœud

202voto

andy t Points 1026

Ma solution,

charger l'application en utilisant

NODE_ENV=production node app.js

Ensuite, il faut configurer 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 de Jans, nous chargeons le fichier et créons une nouvelle instance à laquelle nous pouvons passer une valeur si nécessaire, dans ce cas-ci process.env.NODE_ENV est global et n'est donc pas nécessaire.

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

Nous pouvons alors accéder aux propriétés de l'objet config exactement comme auparavant

conf.twitter.consumerKey

2 votes

Pourquoi utilisez-vous le terme "nouveau" ici ?

5 votes

Je suis d'accord avec @bluehallu. Est new nécessaire ?

2 votes

L'équivalent sous Windows serait SET NODE_ENV=development

62voto

mattwad Points 179

Vous pouvez également avoir un fichier JSON avec NODE_ENV comme niveau supérieur. C'est une meilleure façon 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 } }
    }
}

0 votes

Bonjour, pourriez-vous expliquer pourquoi vous pensez que c'est la meilleure façon d'exprimer les paramètres de configuration (par opposition à l'utilisation d'un script qui renvoie les paramètres). ?

14 votes

Je suppose que cela ne fait pas une grande différence. Mentalement, lorsque je vois JSON, je pense à des données statiques, alors que lorsque je vois un fichier JS, je pense qu'il contient de la logique. De plus, un autre avantage de l'utilisation du type .json est que d'autres langages peuvent importer le même fichier.

2 votes

@VenkatKotra La configuration est généralement considérée comme statique, et donc mieux exprimée de manière déclarative avec des choses comme json, yaml, ini, etc. Fait de manière impérative, avec un script qui produit cet état, implique en quelque sorte quelque chose. dynamique est en train de se produire, ce qui serait une mauvaise chose.

6voto

Ali Davut Points 363

Il y a eu une question de ce type, ma réponse est la suivante aquí .

Vous pouvez utiliser Konfig pour charger facilement des configurations spécifiques à l'environnement.

5voto

Jan Jongboom Points 15148

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 comme 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. Lorsque vous les écrivez en tant que tels :

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

(function () {
    this.methodOnWorkspace = function () {

    };
}).call(Workspace.prototype);

Vous pouvez alors l'appeler dans app.js comme :

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

0 votes

Je préfère garder toute la logique à l'intérieur de l'app.js app.configure('development mais je vais jeter un coup d'œil pour voir si je peux utiliser cette solution avec ce code.

0 votes

Mise à jour de cette réponse : Architecte est un cadre de gestion des dépendances qui résout ce problème d'une manière bien plus agréable.

3voto

Harish Anchu Points 1102

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

Ce module est capable de définir un environnement de configuration basé sur le nom de votre ordinateur. Ensuite, lorsque vous demandez une configuration, vous obtiendrez une valeur spécifique à l'environnement.

Par exemple, supposons que vous ayez 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, vous devez obtenir la configuration de l'environnement de "développement" dans pc1 ou pc2 et la configuration de l'environnement de "production" dans pc3. Cela peut se faire de la manière suivante :

  1. Créer un fichier de configuration de base dans le répertoire config, disons "app.json" et y ajouter les configurations requises.
  2. Il suffit maintenant de créer des dossiers dans le répertoire config qui correspondent au nom de votre environnement, dans ce cas "development" 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 que vous ne devez pas spécifier toutes les options qui se trouvent dans le fichier de configuration de base, mais seulement les options que vous souhaitez remplacer. Les fichiers de configuration de l'environnement se superposeront aux 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"],

   }
);

Vous pouvez désormais obtenir n'importe quelle valeur de configuration sans vous soucier de l'environnement :

config.get('app').configurationKey;

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