web-dev-qa-db-ja.com

Node.jsは、everyauthで使用される環境固有の設定を設定します

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

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

この中に、キーと秘密の組み合わせでoAuth構成ファイルをロードします。

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

これらのコードは環境によって異なります-コールバックは異なるURLであるため、開発/ステージング/プロダクション。

Qu。すべてのモジュールをフィルタリングするように環境設定でこれらを設定する方法、またはモジュールにパスを直接渡すことができますか?

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

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

105
andy t

私の解決策、

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

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

次に、以前とまったく同じようにconfigオブジェクトのプロパティにアクセスできます

conf.Twitter.consumerKey
185
andy t

また、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 } }
    }
}
54
mattwad

非常に便利な解決策は、 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またはlocal-development.json

完全な ロード順のリスト

アプリ内

アプリでは、設定と必要な属性のみが必要です。

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

アプリをロード

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

NODE_ENV=production node app.js

またはforeverまたはpm2で正しい環境を設定する

Forever:

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

PM2(シェル経由):

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

このソリューションは非常にクリーンであり、本番/ステージング/開発環境用とローカル設定用に異なる設定ファイルを簡単に設定できます。

31
Zauker

手短に

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

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 /、詳細を確認してください。

12
kris

エレガントな方法は、.envファイルを使用して、プロダクション設定をローカルでオーバーライドすることです。コマンドラインスイッチは不要です。 config.jsonファイル内のすべてのコンマとブラケットは不要です。 ここに私の答えを見てください

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

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

ローカルの.envは、環境変数をオーバーライドします。しかし、ステージングサーバーまたは運用サーバー(heroku.comにある可能性があります)では、NODE_ENV=stageまたは運用NODE_ENV=prodをステージングするための環境変数が事前に設定されています。

5
Benxamin

これを行う方法は、環境でアプリを起動するときに引数を渡すことです。例えば:

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
Jan Jongboom

nodejs-config モジュールを使用して、これをよりエレガントな方法で実行してみてください。

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

たとえば、pc1とpc2という名前の2つの開発マシンとpc3という名前の本番マシンがあるとします。 pc1またはpc2のコードで設定値を要求するときは、「開発」環境設定を取得する必要があり、pc3では「本番」環境設定を取得する必要があります。これは次のように実現できます。

  1. Configディレクトリに基本構成ファイルを作成し、「app.json」と言って必要な構成を追加します。
  2. 環境名(この場合は「開発」と「本番」)に一致するconfigディレクトリ内にフォルダーを作成します。
  3. 次に、オーバーライドする構成ファイルを作成し、環境ディレクトリで各環境のオプションを指定します(ベース構成ファイルにあるすべてのオプションを指定する必要はありませんが、オーバーライドするオプションのみを指定します。環境設定ファイルはベースファイルの上に「カスケード」されます。).

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

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

   }
);

これで、次のような環境を心配することなく、任意の構成値を取得できます。

config.get('app').configurationKey;
3
Harish Anchu