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.json或local-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。 这可以这样来实现:
- 在config目录中创build一个基本的configuration文件,让我们说“app.json”,并添加所需的configuration。
- 现在只需在config目录下创build与您的环境名称相匹配的文件夹,在这种情况下是“开发”和“生产”。
- 接下来,创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/ ,检查出来更多详情。