Node.js设置与Everyauth一起使用的环境特定配置

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)

  • 我是第二个@bluehallu."新"是必要的吗? (4认同)
  • 而不是做'新'.我在`config.js`中执行以下操作....`Config = function(){...}; module.exports = Config()` (3认同)
  • 你为什么在这里使用新的? (2认同)
  • Windows中的等效项将是SET NODE_ENV = development (2认同)

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)

  • 我想这并没有太大的区别.在心理上,当我看到JSON时,我认为"静态数据"与我看到JS文件时相比,我认为其中有一些逻辑.此外,使用.json类型的另一个好处是其他语言可以导入相同的文件. (13认同)
  • 请注意,此方法会在源代码管理中公开凭据. (7认同)
  • @VenkatKotra 配置通常被认为是静态的,因此最好用 json、yaml、ini 等内容声明性地表达。命令式完成,使用产生该状态的脚本,sortof 暗示某些 _dynamic_ 正在发生,这会很糟糕。 (2认同)

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.jsonlocal-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)

或者使用foreverpm2设置正确的环境

永远:

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/,请查看更多详情.


Jan*_*oom 5

我们这样做的方法是在使用环境启动应用程序时传递参数.例如:

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)


Ben*_*min 5

一种优雅的方法是使用.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.


aja*_* mp 5

在部署服务器中设置环境变量(例如:像 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)

快乐编码...