Js 设置与 Everyauth 一起使用的特定于环境的配置

我正在使用 node.js + Express.js + everauth.js

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

inside this I load my oAuth config file with the key/secret combinations:

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

这些代码对于不同的环境是不同的——开发/准备/生产,因为回调是针对不同的 URL 的。

问: 如何在环境配置中设置这些内容以过滤所有模块,或者可以将路径直接传递到模块中?

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

希望这能说得通

223578 次浏览

我们的方法是在启动应用程序的环境时传入一个参数,例如:

node app.js -c dev

In app.js we then load dev.js as our configuration file. You can parse these options with 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);

我的解决办法是,

加载应用程序

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

Then as per Jans solution load the file and create a new instance which we could pass in a value if needed, in this case process.env.NODE_ENV is global so not needed.

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

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

conf.twitter.consumerKey

您还可以拥有一个顶层为 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 } }
}
}

如何做到这一点与 Nodejs-config模块更优雅的方式。

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

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

  1. 在 config 目录中创建一个基本配置文件,输入“ app.json”并向其添加所需的配置。
  2. 现在只需在 config 目录中创建与您的环境名称相匹配的文件夹,在本例中是“ development”和“ production”。
  3. 接下来,创建要重写的配置文件,并在环境目录中为每个环境指定选项(注意,不必指定基本配置文件中的每个选项,只需指定要重写的选项。环境配置文件将在基本文件上“级联”。).

Now create new config instance with following syntax.

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


}
);

现在您可以得到任何配置值,而不用担心环境如下:

config.get('app').configurationKey;

An elegant way is to use .env file to locally override production settings. 不需要命令行开关。在 config.json文件中不需要所有这些逗号和括号。点击这里查看我的答案

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

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

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

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

安装模块后:

$ npm install config

您可以创建一个 Default.json配置文件(您可以使用 JSON 或 JS 对象,使用扩展名.json5)

比如说

$ vi config/default.json


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

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

Json 可以是:

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

Json 可以是:

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

In your local PC you could have a 本地人 Json that override all environment, or you could have a specific local configuration as 本地制片 Json or 本地开发部的 Json.

完整的 装货顺序表装货顺序表

在你的应用里

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

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

Load the App

加载应用程序使用:

NODE_ENV=production node app.js

或用 永远PM2设置正确的环境

Forever:

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

PM2(通过外壳) :

export NODE_ENV=staging
pm2 start app.js

PM2(via. 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

这个解决方案非常干净,它可以很容易地为生产/分段/开发环境和本地设置设置不同的配置文件。

简而言之

这种设置简单而优雅:

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

通用 JS

var env = require('env.json');


exports.config = function() {
var node_env = process.env.NODE_ENV || 'development';
return env[node_env];
};

应用程序

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


细节

This solution is from : 译自: 美国《科学》杂志网站(http://himanshu.gilani.info/blog/2012/09/26/bootstrating-a-node-dot-js-app-for-dev-slash-prod-Environment/”rel = “ norefrer”> http://himanshu.gilani.info/blog/2012/09/26/bootstraping-a-node-dot-js-app-for-dev-slash-prod-environment/, check it out for more detail.

这个答案并不新鲜。它类似于@andy _ t 提到的。但是我使用下面的模式有两个原因。

  1. 没有外部 npm 依赖项的干净实现

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

Javascript implementation

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

我通常在我的节点项目中使用打印脚本。

Typescript implementation

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)

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

编码愉快..。