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

时间:2011-11-30 20:12:52

标签: node.js environment-variables everyauth

我使用的是node.js + express.js + everyauth.js。我已将所有的Everyauth逻辑移动到模块文件中

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

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

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

这些代码对于不同的环境是不同的 - 开发/登台/制作,因为回调是针对不同的网址。

问。如何在环境配置中设置这些以过滤所有模块,还是可以将路径直接传递到模块中?

设置为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'});
});

?希望有意义

9 个答案:

答案 0 :(得分:185)

我的解决方案,

使用

加载应用
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解决方案加载文件并创建一个新实例,我们可以根据需要传入一个值,在这种情况下process.env.NODE_ENV是全局的,所以不需要。

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

然后我们可以像以前一样完全访问配置对象属性

conf.twitter.consumerKey

答案 1 :(得分:53)

您还可以使用NODE_ENV作为顶级的JSON文件。 IMO,这是表达配置设置的更好方式(与使用返回设置的脚本相反)。

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 } }
    }
}

答案 2 :(得分:31)

一个非常有用的解决方案是使用config module

安装模块后:

$ npm install config

您可以创建 default.json 配置文件。 (您可以使用扩展名.json5来使用JSON或JS对象)

例如

$ vi config/default.json

{
  "name": "My App Name",
  "configPath": "/my/default/path",
  "port": 3000
}

此默认配置可以由环境配置文件或本地开发环境的本地配置文件覆盖:

production.json 可以是:

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

development.json 可以是:

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

在您的本地PC中,您可以使用 local.json 覆盖所有环境,或者您可以将特定的本地配置设置为 local-production.json 本地development.json

完整list of load order

在您的应用内

在您的应用中,您只需要配置和所需的属性。

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

此解决方案非常简洁,可以轻松设置生产/登台/开发环境和本地设置的不同配置文件。

答案 3 :(得分:12)

简而言之

这种设置简单而优雅:

<强> 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

详细

此解决方案来自: http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/ ,请查看详细信息。

答案 4 :(得分:5)

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

node app.js -c dev

然后在app.js中加载dev.js作为我们的配置文件。您可以使用optparse-js解析这些选项。

现在您有一些依赖于此配置文件的核心模块。当你这样写时:

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);

答案 5 :(得分:5)

一种优雅的方法是使用.env文件在本地覆盖生产设置。 无需命令行开关。不需要config.json文件中的所有逗号和括号。 See my answer here

示例:在我的机器上.env文件为:

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

我的本​​地.env会覆盖任何环境变量。但是在登台或生产服务器上(可能是他们在heroku.com上),环境变量已预先设置为阶段NODE_ENV=stage或生产NODE_ENV=prod

答案 6 :(得分:3)

如何使用nodejs-config模块以更优雅的方式执行此操作。

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

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

  1. 在config目录中创建一个基本配置文件,让我们说“app.json”并为其添加所需的配置。
  2. 现在只需在config目录中创建与您的环境名称匹配的文件夹,在本例中为“development”和“production”。
  3. 接下来,创建要覆盖的配置文件,并在环境目录中指定每个环境的选项(请注意,您不必指定基本配置文件中的每个选项,而只需指定您希望的选项)环境配置文件将“级联”在基本文件上。)。
  4. 现在使用以下语法创建新的配置实例。

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

    现在您可以获得任何配置值而无需担心这样的环境:

    config.get('app').configurationKey;
    

答案 7 :(得分:0)

这个答案不是什么新鲜事物。它类似于@andy_t提到的内容。但是我使用以下模式有两个原因。

  1. 无外部npm依赖的干净实现

  2. 将默认配置设置与基于环境的设置合并。

JavaScript实现

const settings = {
    _default: {
       timeout: 100
       baseUrl: "http://some.api/",
    },
    production: {
       baseUrl: "http://some.prod.api/",
    },
}
// If you are not using ECMAScript 2018 Standard
// https://stackoverflow.com/a/171256/1251350
module.exports = { ...settings._default, ...settings[process.env.NODE_ENV] }

我通常在节点项目中使用打字稿。下面是我复制粘贴的实际实现。

打字稿实现

const settings: { default: ISettings, production: any } = {
    _default: {
        timeout: 100,
        baseUrl: "",
    },
    production: {
        baseUrl: "",
    },
}

export interface ISettings {
    baseUrl: string
}

export const config = ({ ...settings._default, ...settings[process.env.NODE_ENV] } as ISettings)

答案 8 :(得分:0)

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

base包含所有环境的通用配置。

然后导入其他模块,例如

const config =  require('path/to/config.js')
console.log(config.port)

快乐编码...