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
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
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 } }
}
}
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.
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
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.
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
.
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);
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:
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;