Node.js设置环境特定的configuration来与everyauth一起使用

我正在使用node.js + express.js + everyauth.js。 我已经将所有的everyauth逻辑转移到模块文件中

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

在这里我加载我的oAuthconfiguration文件与密钥/秘密组合:

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

这些代码对于不同的环境是不同的 – 开发/分期/生产,因为callback是针对不同的URL。

曲。 如何在环境configuration中设置这些参数以通过所有模块进行过滤,或者可以将path直接传递到模块中?

设置env:

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

通过

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

? 希望是有道理的

我的解决scheme

使用加载应用程序

 NODE_ENV=production node app.js 

然后将config.js设置为一个函数而不是一个对象

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

然后根据Jans解决scheme加载文件并创build一个新的实例,如果需要的话可以传入一个值,在这种情况下, process.env.NODE_ENV是全局的,所以不需要。

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

然后我们可以像以前一样访问configuration对象的属性

 conf.twitter.consumerKey 

你也可以有一个NODE_ENV作为顶级的JSON文件。 海事组织,这是一个更好的方式来expressionconfiguration设置(而不是使用返回设置的脚本)。

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

env.json示例:

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

一个非常有用的解决scheme是使用configuration模块 。

安装模块后:

 $ npm install config 

你可以创build一个default.jsonconfiguration文件。 (你可以使用扩展名为.json5的JSON或JS对象)

例如

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

这个默认的configuration可以被环境configuration文件或本地开发环境的本地configuration文件覆盖:

production.json可以是:

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

development.json可以是:

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

在你的本地PC中,你可以有一个local.json覆盖所有的环境,或者你可以有一个特定的本地configurationlocal-production.jsonlocal-development.json

加载顺序的完整列表 。

在你的应用程序内

在你的应用程序中,只需要configuration和所需的属性。

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

加载应用程序

加载应用程序使用:

 NODE_ENV=production node app.js 

永远pm2设置正确的环境

永远:

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

PM2(通过shell):

 export NODE_ENV=staging pm2 start app.js 

PM2(通过.json):

process.json

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

接着

 $ pm2 start process.json --env production 

这个解决scheme非常干净,并且可以轻松地为生产/分段/开发环境和本地设置设置不同的configuration文件。

我们这样做的方式是在启动应用程序的时候传递一个参数。 例如:

 node app.js -c dev 

在app.js中,我们加载dev.js作为我们的configuration文件。 您可以使用optparse-jsparsing这些选项。

现在你有一些核心模块,这取决于这个configuration文件。 当你这样写:

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

你可以在app.js调用它,例如:

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

一个.env方法是使用.env文件在本地覆盖生产设置。 不需要命令行开关。 不需要config.json文件中的所有逗号和括号。 在这里看到我的答案

例如:在我的机器上.env文件是这样的:

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

我的本地.env覆盖任何环境variables。 但是在分段或生产服务器上(可能是在heroku.com上),环境variables预先设置为NODE_ENV=stage或production NODE_ENV=prod

如何用nodejs-config模块以更优雅的方式来做到这一点。

此模块可以根据您的计算机名称设置configuration环境。 之后,当您请求configuration时,您将获得环境特定的值。

例如,假设您有两台名为pc1和pc2的开发机器和一台名为pc3的生产机器。 当您在pc1或pc2中的代码中请求configuration值时,您必须获得“开发”环境configuration,而在pc3中,您必须获得“生产”环境configuration。 这可以这样来实现:

  1. 在config目录中创build一个基本的configuration文件,让我们说“app.json”,并添加所需的configuration。
  2. 现在只需在config目录下创build与您的环境名称相匹配的文件夹,在这种情况下是“开发”和“生产”。
  3. 接下来,创build您想要覆盖的configuration文件,并在环境目录中为每个环境指定选项(注意,您不必指定基本configuration文件中的每个选项,而只指定希望覆盖的选项。环境configuration文件将“级联”在基础文件上)。

现在使用以下语法创build新的configuration实例。

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

现在你可以得到任何configuration值,而不用担心这样的环境:

 config.get('app').configurationKey; 

简单来说

这种设置简单而优雅:

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 

以生产模式运行: $ NODE_ENV=production node app.js


详细

这个解决scheme是从http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/ ,检查出来更多详情。

    Interesting Posts