126

node.js + express.js + everyauth.js を使用しています。すべての everyauth ロジックをモジュール ファイルに移動しました

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

この中に、キー/シークレットの組み合わせで oAuth 構成ファイルをロードします。

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

これらのコードは、コールバックが異なる URL に対して行われるため、開発 / ステージング / 運用環境によって異なります。

質問:環境構成でこれらを設定して、すべてのモジュールをフィルター処理するにはどうすればよいですか? または、パスをモジュールに直接渡すことができますか?

環境に設定:

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

? それが理にかなっていることを願っています

4

9 に答える 9

202

私の解決策、

を使用してアプリをロードします

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
于 2011-12-02T11:14:08.057 に答える
38

A very useful solution is use the config module.

after install the module:

$ npm install config

You could create a default.json configuration file. (you could use JSON or JS object using extension .json5 )

For example

$ vi config/default.json

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

This default configuration could be override by environment config file or a local config file for a local develop environment:

production.json could be:

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

development.json could be:

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

In your local PC you could have a local.json that override all environment, or you could have a specific local configuration as local-production.json or local-development.json.

The full list of load order.

Inside your App

In your app you only need to require config and the needed attribute.

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

Load the App

load the app using:

NODE_ENV=production node app.js

or setting the correct environment with forever or pm2

Forever:

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

PM2 (via shell):

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

And then

$ pm2 start process.json --env production

This solution is very clean and it makes easy set different config files for Production/Staging/Development environment and for local setting too.

于 2016-04-18T13:41:57.113 に答える
20

簡単に言えば

この種のセットアップはシンプルでエレガントです:

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/からのものです。もっと詳しく。

于 2016-08-20T23:18:46.243 に答える
5

洗練された方法は、.envfile を使用してプロダクション設定をローカルでオーバーライドすることです。コマンド ライン スイッチは不要です。ファイル内のこれらすべてのコンマとブラケットは必要ありませんconfig.jsonここで私の答えを見てください

例: 私のマシンでは、.envファイルは次のとおりです。

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

私のローカル.envは、環境変数をオーバーライドします。しかし、ステージング サーバーまたはプロダクション サーバー (おそらく heroku.com にある) では、環境変数は stageNODE_ENV=stageまたは productionに事前設定されていNODE_ENV=prodます。

于 2015-03-03T00:12:13.780 に答える
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;

「ベース」には、すべての環境に共通の構成が含まれています。

次に、次のような他のモジュールにインポートします。

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

ハッピーコーディング...

于 2019-10-30T09:35:23.483 に答える
3

nodejs-configモジュールを使用して、より洗練された方法でこれを行うにはどうすればよいでしょうか。

このモジュールは、コンピューターの名前に基づいて構成環境を設定できます。その後、構成を要求すると、環境固有の値が取得されます。

たとえば、pc1 と pc2 という名前の 2 つの開発マシンと、pc3 という名前のプロダクション マシンがあると仮定します。pc1 または pc2 のコードで構成値を要求するときはいつでも、「開発」環境構成を取得する必要があり、pc3 では「実稼働」環境構成を取得する必要があります。これは次のように実現できます。

  1. config ディレクトリに基本構成ファイルを作成し、「app.json」と言って必要な構成を追加します。
  2. config ディレクトリ内に、環境名 (この場合は "development" と "production") に一致するフォルダーを作成するだけです。
  3. 次に、オーバーライドする構成ファイルを作成し、環境ディレクトリで各環境のオプションを指定します (基本構成ファイルにあるすべてのオプションを指定する必要はなく、オーバーライドするオプションのみを指定する必要があることに注意してください。環境構成ファイルは、基本ファイルに「カスケード」します。)

次の構文で新しい構成インスタンスを作成します。

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

   }
);

次のように、環境を気にせずに任意の構成値を取得できるようになりました。

config.get('app').configurationKey;
于 2014-10-15T18:04:17.757 に答える
0

この答えは新しいものではありません。@andy_t が言及したものと似ています。しかし、私は 2 つの理由から以下のパターンを使用します。

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

私は通常、ノード プロジェクトで typescript を使用します。以下は、私の実際の実装をコピーして貼り付けたものです。

タイプスクリプトの実装

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)
于 2019-10-30T09:17:33.387 に答える