and*_*y t 108 environment-variables node.js everyauth
我使用的是node.js + express.js + everyauth.js.我已将所有的Everyauth逻辑移动到模块文件中
var login = require('./lib/everyauthLogin');
Run Code Online (Sandbox Code Playgroud)
在这里我加载我的oAuth配置文件与密钥/秘密组合:
var conf = require('./conf');
.....
twitter: {
consumerKey: 'ABC',
consumerSecret: '123'
}
Run Code Online (Sandbox Code Playgroud)
这些代码对于不同的环境是不同的 - 开发/登台/生产,因为回调是针对不同的URL.
曲.如何在环境配置中设置这些以过滤所有模块,还是可以将路径直接传递到模块中?
在env中设置:
app.configure('development', function(){
app.set('configPath', './confLocal');
});
app.configure('production', function(){
app.set('configPath', './confProduction');
});
var conf = require(app.get('configPath'));
Run Code Online (Sandbox Code Playgroud)
通过
app.configure('production', function(){
var login = require('./lib/everyauthLogin', {configPath: './confProduction'});
});
Run Code Online (Sandbox Code Playgroud)
?希望有道理
and*_*y t 189
我的解决方案
使用加载应用程序
NODE_ENV=production node app.js
Run Code Online (Sandbox Code Playgroud)
然后设置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};
}
};
Run Code Online (Sandbox Code Playgroud)
然后根据Jans解决方案加载文件并创建一个新实例,如果需要我们可以传入一个值,在这种情况下process.env.NODE_ENV
是全局的,所以不需要.
var Config = require('./conf'),
conf = new Config();
Run Code Online (Sandbox Code Playgroud)
然后我们可以像以前一样完全访问配置对象属性
conf.twitter.consumerKey
Run Code Online (Sandbox Code Playgroud)
mat*_*wad 56
您还可以使用NODE_ENV作为顶级的JSON文件.IMO,这是表达配置设置的更好方式(与使用返回设置的脚本相反).
var config = require('./env.json')[process.env.NODE_ENV || 'development'];
Run Code Online (Sandbox Code Playgroud)
env.json的示例:
{
"development": {
"MONGO_URI": "mongodb://localhost/test",
"MONGO_OPTIONS": { "db": { "safe": true } }
},
"production": {
"MONGO_URI": "mongodb://localhost/production",
"MONGO_OPTIONS": { "db": { "safe": true } }
}
}
Run Code Online (Sandbox Code Playgroud)
Zau*_*ker 32
一个非常有用的解决方案是使用配置模块.
安装模块后:
$ npm install config
Run Code Online (Sandbox Code Playgroud)
您可以创建default.json配置文件.(您可以使用扩展名.json5来使用JSON或JS对象)
例如
$ vi config/default.json
{
"name": "My App Name",
"configPath": "/my/default/path",
"port": 3000
}
Run Code Online (Sandbox Code Playgroud)
环境配置文件或本地开发环境的本地配置文件可以覆盖此默认配置:
production.json可能是:
{
"configPath": "/my/production/path",
"port": 8080
}
Run Code Online (Sandbox Code Playgroud)
development.json可能是:
{
"configPath": "/my/development/path",
"port": 8081
}
Run Code Online (Sandbox Code Playgroud)
在本地PC中,您可以拥有覆盖所有环境的local.json,或者您可以将特定的本地配置作为local-production.json或local-development.json.
在您的应用内
在您的应用中,您只需要配置和所需的属性.
var conf = require('config'); // it loads the right file
var login = require('./lib/everyauthLogin', {configPath: conf.get('configPath'));
Run Code Online (Sandbox Code Playgroud)
加载应用程序
使用以下方式加载应用
NODE_ENV=production node app.js
Run Code Online (Sandbox Code Playgroud)
或者使用forever或pm2设置正确的环境
永远:
NODE_ENV=production forever [flags] start app.js [app_flags]
Run Code Online (Sandbox Code Playgroud)
PM2(通过壳):
export NODE_ENV=staging
pm2 start app.js
Run Code Online (Sandbox Code Playgroud)
PM2(通过.json):
process.json
{
"apps" : [{
"name": "My App",
"script": "worker.js",
"env": {
"NODE_ENV": "development",
},
"env_production" : {
"NODE_ENV": "production"
}
}]
}
Run Code Online (Sandbox Code Playgroud)
然后
$ pm2 start process.json --env production
Run Code Online (Sandbox Code Playgroud)
这个解决方案非常干净,可以轻松地为生产/登台/开发环境和本地设置设置不同的配置文件.
kri*_*ris 13
这种设置简单而优雅:
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",
}
}
Run Code Online (Sandbox Code Playgroud)
common.js
var env = require('env.json');
exports.config = function() {
var node_env = process.env.NODE_ENV || 'development';
return env[node_env];
};
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
要在生产模式下运行:
$ NODE_ENV=production node app.js
此解决方案来自:http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/,请查看更多详情.
我们这样做的方法是在使用环境启动应用程序时传递参数.例如:
node app.js -c dev
Run Code Online (Sandbox Code Playgroud)
然后在app.js中加载dev.js
我们的配置文件.您可以使用optparse-js解析这些选项.
现在您有一些依赖于此配置文件的核心模块.当你这样写时:
var Workspace = module.exports = function(config) {
if (config) {
// do something;
}
}
(function () {
this.methodOnWorkspace = function () {
};
}).call(Workspace.prototype);
Run Code Online (Sandbox Code Playgroud)
然后你就可以这样称呼它app.js
:
var Workspace = require("workspace");
this.workspace = new Workspace(config);
Run Code Online (Sandbox Code Playgroud)
一种优雅的方法是使用.env
文件在本地覆盖生产设置.无需命令行开关.不需要文件中的所有逗号和括号config.json
.在这里看到我的答案
示例:在我的机器上,.env
文件是这样的:
NODE_ENV=dev
TWITTER_AUTH_TOKEN=something-needed-for-api-calls
Run Code Online (Sandbox Code Playgroud)
我的本地.env
覆盖任何环境变量.但是在暂存或生产服务器上(可能是在heroku.com上),环境变量已预先设置为阶段NODE_ENV=stage
或生产NODE_ENV=prod
.
在部署服务器中设置环境变量(例如:像 NODE_ENV=production)。您可以通过 process.env.NODE_ENV 访问您的环境变量。为全局设置找到以下配置文件
const env = process.env.NODE_ENV || "development"
const configs = {
base: {
env,
host: '0.0.0.0',
port: 3000,
dbPort: 3306,
secret: "secretKey for sessions",
dialect: 'mysql',
issuer : 'Mysoft corp',
subject : 'some@user.com',
},
development: {
port: 3000,
dbUser: 'root',
dbPassword: 'root',
},
smoke: {
port: 3000,
dbUser: 'root',
},
integration: {
port: 3000,
dbUser: 'root',
},
production: {
port: 3000,
dbUser: 'root',
}
};
const config = Object.assign(configs.base, configs[env]);
module.exports= config;
Run Code Online (Sandbox Code Playgroud)
base 包含所有环境的通用配置。
然后导入其他模块,如
const config = require('path/to/config.js')
console.log(config.port)
Run Code Online (Sandbox Code Playgroud)
快乐编码...
归档时间: |
|
查看次数: |
188579 次 |
最近记录: |