Node.jsデプロイメント設定/構成ファイルを保存する方法は?


640

私はいくつかのNodeアプリで作業しており、展開関連の設定を保存するための良いパターンを探していました。Djangoの世界(私の出身地)では、一般的な方法としてsettings.py、標準設定(タイムゾーンなど)を含むファイルをlocal_settings.py用意し、次にデプロイメント固有の設定を行うという方法があります。どのデータベースと通信するか、どのmemcacheソケットか、管理者の電子メールアドレスなど。

Nodeに似たパターンを探しています。構成ファイルだけでいいのでapp.js、の他のすべての要素と干渉する必要はありませんが、ソース管理にないファイルにサーバー固有の構成を含める方法を用意することが重要です。同じアプリを、非常に異なる設定の異なるサーバー間でデプロイすることもできます。マージの競合などに対処する必要があり、それが私の楽しみではありません。

これには何らかのフレームワーク/ツールがありますか、それとも誰もが自分で何かをハッキングするだけですか?


mean.jsでの構成方法が本当に好きです。基本的に、アプリ環境ごとの異なる設定(本番環境、開発、テスト用)に基づいて、アプリ関連の構成を別の種類のモジュールに格納し、シークレットなどのアプリ環境変数を通じて特定の詳細を渡します
Hinrich

回答:


765

package.jsonはパッケージとconfig.js構成にを使用します。これは次のようになります。

var config = {};

config.twitter = {};
config.redis = {};
config.web = {};

config.default_stuff =  ['red','green','blue','apple','yellow','orange','politics'];
config.twitter.user_name = process.env.TWITTER_USER || 'username';
config.twitter.password=  process.env.TWITTER_PASSWORD || 'password';
config.redis.uri = process.env.DUOSTACK_DB_REDIS;
config.redis.host = 'hostname';
config.redis.port = 6379;
config.web.port = process.env.WEB_PORT || 9980;

module.exports = config;

プロジェクトから設定をロードします:

var config = require('./config');

そして、私はからのものにアクセスできますconfig.db_hostconfig.db_portなど...これは私がソースコントロールでパスワードを保存したくない場合は、環境変数に保存されているいずれかの使用ハードコーディングパラメータ、またはパラメータをすることができます。

私はまたpackage.json、依存関係セクションを生成して挿入します:

"dependencies": {
  "cradle": "0.5.5",
  "jade": "0.10.4",
  "redis": "0.5.11",
  "socket.io": "0.6.16",
  "twitter-node": "0.0.2",
  "express": "2.2.0"
}

プロジェクトをローカルマシンに複製するときにnpm install、パッケージをインストールするために実行します。詳細はこちら

プロジェクトはGitHubに保存されており、運用サーバー用にリモートが追加されています。


32
開発と製品の構成設定が異なる場合はどうなりますか?
揺れ動く2012

4
私はしていませんが、これを行う1つの方法があります。環境ごとに、ENV変数に環境名を設定します。次に、このファイルで、そのjavascript .. caseまたはifステートメントを使用して、適切な変数を選択的にロードします。各環境ごとに個別の構成サブファイルを作成し、ifステートメントでサブファイルをここでサブ構成変数に再読み込みし、そのサブ構成変数をメイン構成にエクスポートすることもできます。基本的に私が言っているのは、 js、それであなたは創造的になることができます
noli '09 / 09/21

4
どのprocess.env?どこにありますか?そしてそれを設定する方法?
怒ったキウイ

12
私は「すごい.. node.jsを数時間見ていて、アプリはすでに動作している..さて、私が思いついたこのランダムなコードのビットを共有します」
noli

3
環境変数を使用して、これらのパスワードを格納できませんか?この行の目的はそうではありません:config.twitter.password = process.env.TWITTER_PASSWORD || 'パスワード';
DMart 2015年

244

Node v0.5.xの時点でJSONファイルを要求できます(この回答を参照してください)

config.json:

{
    "username" : "root",
    "password" : "foot"
}

app.js:

var config = require('./config.json');
log_in(config.username, config.password);

40
その機能にはそれほど感心していません。あなたは( "./config.js")を要求することができ、あなたは私が非常に重要だと思う設定ファイルや他のベルやホイッスルにコメントを追加する能力を得ます。configが単なるプロパティでコードがない場合は、requires(config.js)でJSONを前に付けたexports.config =
teknopaul

3
@teknopaulあなたは正しいですが、以前は '正確性' /ダム対スマートテンプレートシステムの使用のしやすさについて大きな議論が続いていました。 (2)テンプレート(または構成)のみを行うために「ほぼPL」を再構築することは悪い考えです。既知の動作で既存の実際のPLを再利用する方が良いでしょう。これまでのところ、JSをリサイクルしてユーザー設定を行うための+1。宣言的アプローチを採用しない場合は-1。宣言的な方法でかなり複雑な設定が行われているのを見てきました。私の腸はこれが行く方法であると私に告げます。
フロー

1
VScode(2017年末)のjsonファイルからのオブジェクトにはインテリセンスはありません。module.exportsからのオブジェクトに対して完全に機能するインテリセンス。
Romain Vincent

199

ずっと後で、私は構成を管理するためのかなり良いNode.jsモジュールを見つけました:nconf

簡単な例:

var nconf = require('nconf');

// First consider commandline arguments and environment variables, respectively.
nconf.argv().env();

// Then load configuration from a designated file.
nconf.file({ file: 'config.json' });

// Provide default values for settings not provided above.
nconf.defaults({
    'http': {
        'port': 1337
    }
});

// Once this is in place, you can just use nconf.get to get your settings.
// So this would configure `myApp` to listen on port 1337 if the port
// has not been overridden by any of the three configuration inputs
// mentioned above.
myApp.listen(nconf.get('http:port'));

また、Redisへの設定の保存、構成ファイルの書き込みをサポートし、かなり堅固なAPIを備えています。また、Flatironの一部として、評判の高いNode.jsショップの1つであるNodejitsuによってサポートされています。フレームワークイニシアチブのため、かなり将来性があります。

Githubでnconfをチェックしてください。


2
馬鹿げた質問かもしれませんが、明確な説明はありません。ノード環境変数はどこに設定すればよいですか?私はすでにnconfを使用していますが、環境変数をどこに設定するか明確ではありません。nginx / apacheにありますか?別の構成ファイルですか?
民間人

91
コメントが許可されていないため、configは.jsonファイルの使用をお勧めしません。
Frank Xu

11
これは素晴らしいですね。設定ファイルがコマンドラインオプションと環境変数をオーバーライドする場合、多くのUnixheadsを驚かせると思います。次の優先順位の昇順に慣れています:構成ファイル、環境変数、コマンドラインオプション。
sheldonh 2013

2
@sheldonhブールオプションが常に argvに設定されているため、優先順位が下がることがわかるまで待ちます。:/
Daniel C. Sobral 2013年

@ DanielC.Sobral本当に残念です。ああ、LTNS!:-)
シェルドン2013年

94

私の解決策はかなり簡単です:

./config/index.jsに環境設定をロードします

var env = process.env.NODE_ENV || 'development'
  , cfg = require('./config.'+env);

module.exports = cfg;

./config/config.global.jsでいくつかのデフォルトを定義します

var config = module.exports = {};

config.env = 'development';
config.hostname = 'dev.example.com';

//mongo database
config.mongo = {};
config.mongo.uri = process.env.MONGO_URI || 'localhost';
config.mongo.db = 'example_dev';

./config/config.test.jsのデフォルトを上書きする

var config = require('./config.global');

config.env = 'test';
config.hostname = 'test.example';
config.mongo.db = 'example_test';

module.exports = config;

./models/user.jsで使用:

var mongoose = require('mongoose')
, cfg = require('../config')
, db = mongoose.createConnection(cfg.mongo.uri, cfg.mongo.db);

テスト環境でアプリを実行する:

NODE_ENV=test node ./app.js

2
私はこれを好む。他の人が述べたように、JSONは推奨されるストレージ構造ではなく、グローバルとのこの階層化はシンプルで効果的です
Sebastian J.

これをnconfよりも優先する唯一の理由は、config(dev、test、prod)ファイルに.js形式を使用できるためです。それ以外の場合はJSON形式では不可能な各構成オプションを文書化できます。
Kunal Kapadia、

ところで、NODE_ENVデフォルトは「開発」です。代わりに「製品」を確認する必要があります。
Kevin Suttle、2015年

5
私は開発をチェックしていません。私はそれをデフォルトにしています。なぜ私がデフォルトで本番になるのかわからない。
chovy

39

また、12要素アプリの理念に従うdotenvを検討することもできます。

以前はnode-configを使用していましたが、そのためにdotenvを作成しました。Rubyのdotenvライブラリに完全に触発されました。

使い方はとても簡単です:

var dotenv = require('dotenv');
dotenv.load();

次に、.envファイルを作成し、そこに設定を配置します。

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
OTHER_SECRET_STUFF=my_cats_middle_name

それは nodejsのdotenvです。


2
または、foreman run node xx.jsこれを使用するだけで、自動的に.envファイルも読み込まれます。
Simon

1
このアプローチをプロダクションにも使用できますか?
Lamour、2016

1
@lamarいいえ、実際のサーバーの環境変数に設定します。デプロイするたびにありますが、ソースコードにはありません。
sidonaldson

@Lamarはい、サーバー上で環境変数を設定するよりポータブルな代替手段として、実際にできます。重要な点は、ファイルをバージョン管理またはデプロイメントプロセスに含めない.envことです。
Josh Noe

31

npmを使用してスクリプト(envなど)を起動していますか?

.envファイルを使用する場合は、それらをpackage.json npmを使用をソース/開始することができます。

例:

{
  "name": "server",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node test.js",
    "start-dev": "source dev.env; node test.js",
    "start-prod": "source prod.env; node test.js"
  },
  "dependencies": {
    "mysql": "*"
  }
}

次に、npmスクリプトを実行します。

$ npm start-dev

ここで説明されていますhttps://gist.github.com/ericelliott/4152984 Eric Elliotへのすべてのクレジット


2
「ソース」とは何か説明できますか?私が得るsource : not found
JohnnyBizzle

@JohnnyBizzle source(または単に.)は、現在のシェルで指定されたファイルからコマンドを読み取り、実行するためのUnixシェル(Bashなど)の組み込みコマンドです。つまり、コマンドはサブシェルでは実行されません。この例の効果は、で定義された環境変数prod.envが現在のシェルに追加され、このシェルによって生成された子プロセスに渡されることです。Windows CMDを使用しているようです。詳細については、この質問を参照してください。
Utku 2017

注目に値する-12ファクターアプリでdev.envおよびを作成せずprod.env.envデプロイごとに1 つのファイルを作成することをお勧めします。
Iiridayn

24

$ HOSTおよび$ NODE_ENV変数(RoRに少し似ています)に応じて構成ファイルをロードするnode-configも確認できます。ドキュメント

これは、さまざまな配置設定(developmenttestまたはproduction)で非常に役立ちます。


22

単純settings.jsexports

exports.my_password = 'value'

次に、スクリプトで次のようにしますrequire

var settings = require('./settings.js');

これで、すべての設定がsettings変数を介して利用可能になります。

settings.my_password // 'value'

@backdeskもちろん、シークレットストレージシステムをセットアップして、シークレットを暗号化し、IPやいくつかのトークンなどを使用してアクセスを制限することもできます。しかし、結局のところ、暗号化されているかない。
Vanuan

@backdeskサンプルには問題ありません。それだけです。具体的な説明の例です。
エミリオグリソリア2016年

14

これらの答えのどれも、ほとんどすべてのシステムが必要とするすべての重要なコンポーネントに対処していないので、ここで私の帽子をリングに投げ込みます。考慮事項:

  • パブリック構成(フロントエンドで確認できます)とプライベート構成(mograbiがこれを正しく取得した)です。そして、これらが分離されていることを確認します。
  • 鍵のような秘密
  • デフォルトと環境固有のオーバーライド
  • フロントエンドバンドル

これが私の設定方法です:

  • config.default.private.js -バージョン管理では、これらはバックエンドでのみ表示できるデフォルトの構成オプションです。
  • config.default.public.js -バージョン管理では、これらはバックエンドで表示できるデフォルトの構成オプションです あり、フロント
  • config.dev.private.js -開発者に別のプライベートデフォルトが必要な場合。
  • config.dev.public.js -devに異なるパブリックデフォルトが必要な場合。
  • config.private.js -バージョン管理ではなく、これらは上書きする環境固有のオプションです config.default.private.js
  • config.public.js -バージョン管理ではなく、これらは上書きする環境固有のオプションです config.default.public.js
  • keys/-各ファイルにある種の異なる秘密が格納されているフォルダ。これもバージョン管理下にはありません(キーはバージョン管理下に置かないでください)。

私は構成にプレーン・オールドのJavaScriptファイルを使用しているので、JavaScript言語の全機能を備えています(コメントや、環境固有のファイルにデフォルトの構成ファイルをロードしてオーバーライドできるようにする機能など)。環境変数を使用したい場合は、それらの構成ファイル内にそれらをロードできます(jsonファイルの使用をお勧めしないのと同じ理由で、env varsを使用しないことをお勧めします-プログラミング言語の能力がないため、あなたの設定)。

各キーが個別のファイルにある理由は、インストーラーで使用するためです。これにより、マシン上でキーを作成してキーフォルダーに保存するインストーラーを作成できます。これがないと、キーにアクセスできない構成ファイルをロードすると、インストーラーが失敗する可能性があります。このようにして、コードの特定のバージョンに存在するものや存在しないものを気にすることなく、ディレクトリをトラバースし、そのフォルダーにあるキーファイルをロードできます。

あなたはおそらく、あなたのプライベートコンフィギュレーションにロードされたキーを持っているので、あなたは間違いなくすべてのフロントエンドコードにプライベート設定をロードする必要はありません。フロントエンドのコードベースをバックエンドから完全に分離することはおそらくより理想的ですが、多くの場合、PITAは人々がそれを行うのを防ぐのに十分な大きな障壁であるため、プライベート構成とパブリック構成があります。しかし、プライベート構成がフロントエンドに読み込まれないようにするために私が行う2つのことがあります。

  1. フロントエンドバンドルに、プライベート構成にある秘密鍵が含まれていないことを確認する単体テストがあります。
  2. フロントエンドコードをバックエンドコードとは別のフォルダーに置いており、「config.js」という名前の2つの異なるファイルを持っています。バックエンドの場合、config.jsはプライベート構成をロードし、フロントエンドの場合はパブリック構成をロードします。次に、常にrequire( 'config')し、それがどこから来るのか心配する必要はありません。

最後にもう1つ:構成は、他のどのフロントエンドコードよりも完全に別のファイルを介してブラウザーにロードする必要があります。フロントエンドコードをバンドルする場合、パブリック構成は完全に別のバンドルとして構築する必要があります。そうでなければ、あなたの設定は実際にはもう設定ではありません-それはあなたのコードの一部です。構成は、マシンごとに異なる必要があります。


13

有罪判決は、検証のためのスキーマを追加するもう1つのオプションです。nconfと同様に、環境変数、引数、ファイル、jsonオブジェクトの任意の組み合わせからの設定の読み込みをサポートしています。

READMEの例:

var convict = require('convict');
var conf = convict({
  env: {
    doc: "The applicaton environment.",
    format: ["production", "development", "test"],
    default: "development",
    env: "NODE_ENV"
  },
  ip: {
    doc: "The IP address to bind.",
    format: "ipaddress",
    default: "127.0.0.1",
    env: "IP_ADDRESS",
  },
  port: {
    doc: "The port to bind.",
    format: "port",
    default: 0,
    env: "PORT"
  }
});

入門記事: node-convictで構成を使いこなす


12

Konfigを環境固有の構成ファイルに使用できます。jsonまたはyaml構成ファイルを自動的にロードし、デフォルト値と動的構成機能を備えています。

Konfigリポジトリの例:

File: config/app.json
----------------------------
{
    "default": {
        "port": 3000,
        "cache_assets": true,
        "secret_key": "7EHDWHD9W9UW9FBFB949394BWYFG8WE78F"
    },

    "development": {
        "cache_assets": false
    },

    "test": {
        "port": 3001
    },

    "staging": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    },

    "production": {
        "port": #{process.env.PORT},
        "secret_key": "3F8RRJR30UHERGUH8UERHGIUERHG3987GH8"
    }
}

開発中:

> config.app.port
3000

本番環境でアプリケーションを開始すると仮定します $ NODE_ENV=production PORT=4567 node app.js

> config.app.port
4567

詳細:https : //github.com/vngrs/konfig


9

私は名前を付けたファイルを構成としてフォルダを作成し、config.js後で必要に応じてこのファイルを以下のように使用します

config.jsの例

module.exports = {
    proxyURL: 'http://url:port',
    TWITTER: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    GOOGLE: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    },
    FACEBOOK: {
        consumerkey: 'yourconsumerkey',
        consumerSecrete: 'yourconsumersecrete'
    }
}

次に、この構成ファイルをどこかで使用したい場合

最初に以下のようにインポートします

var config = require('./config');

以下のように値にアクセスできます

const oauth = OAuth({
    consumer: {
        key: config.TWITTER.consumerkey,
        secret: config.TWITTER.consumerSecrete
    },
    signature_method: 'HMAC-SHA1',
    hash_function(base_string, key) {
        return crypto.createHmac('sha1', key).update(base_string).digest('base64');
    }
});

6

npmモジュールを使用するだけconfig(300000ダウンロード以上)

https://www.npmjs.com/package/config

Node-configは、アプリのデプロイの階層構成を整理します。

これにより、デフォルトのパラメータのセットを定義し、それらをさまざまなデプロイメント環境(開発、QA、ステージング、本番など)に拡張できます。

$ npm install config
$ mkdir config
$ vi config/default.json


{
      // Customer module configs
      "Customer": {
        "dbConfig": {
          "host": "localhost",
          "port": 5984,
          "dbName": "customers"
        },
        "credit": {
          "initialLimit": 100,
          // Set low for development
          "initialDays": 1
        }
      }
}



$ vi config/production.json

{
  "Customer": {
    "dbConfig": {
      "host": "prod-db-server"
    },
    "credit": {
      "initialDays": 30
    }
  }
}



$ vi index.js

var config = require('config');
//...
var dbConfig = config.get('Customer.dbConfig');
db.connect(dbConfig, ...);

if (config.has('optionalFeature.detail')) {
  var detail = config.get('optionalFeature.detail');
  //...
}


$ export NODE_ENV=production
$ node index.js

4

「開発」「本番」を分離することをお勧めします構成勧めします。

私は次の方法を使用します:これが私のconfig / index.jsファイルです:

const config = {
    dev : {
        ip_address : '0.0.0.0',
        port : 8080,
        mongo :{
            url : "mongodb://localhost:27017/story_box_dev",
            options : ""
        }
    },
    prod : {
        ip_address : '0.0.0.0',
        port : 3000,
        mongo :{
            url : "mongodb://localhost:27017/story_box_prod",
            options : ""
        }
    }
} 

構成を使用するには、次を使用します。

const config = require('../config')[process.env.NODE_ENV];

あなたはあなたの設定オブジェクトを使うことができます:

const ip_address = config.ip_address;
const port = config.port;

またmodule.exports = config;config/index.jsファイルの最後で使用することもできます
mapmalith

3

ゲームには少し遅れましたが、ここや他のどこにも必要なものが見つからなかったので、自分で何かを書きました。

構成メカニズムに対する私の要件は次のとおりです。

  1. フロントエンドをサポートします。フロントエンドが構成を使用できない場合のポイントは何ですか?
  2. サポートsettings-overrides.js-同じように見えますが、で構成のオーバーライドを許可しますsettings.js。ここでの考え方は、コードを変更せずに構成を簡単に変更することです。私はそれがsaasに役立つと思います。

私はサポート環境をあまり気にしませんが、それを私のソリューションに簡単に追加する方法を説明します

var publicConfiguration = {
    "title" : "Hello World"
    "demoAuthToken" : undefined, 
    "demoUserId" : undefined, 
    "errorEmail" : null // if null we will not send emails on errors. 

};

var privateConfiguration = {
    "port":9040,
    "adminAuthToken":undefined,
    "adminUserId":undefined
}

var meConf = null;
try{
    meConf = require("../conf/dev/meConf");
}catch( e ) { console.log("meConf does not exist. ignoring.. ")}




var publicConfigurationInitialized = false;
var privateConfigurationInitialized = false;

function getPublicConfiguration(){
    if (!publicConfigurationInitialized) {
        publicConfigurationInitialized = true;
        if (meConf != null) {
            for (var i in publicConfiguration) {
                if (meConf.hasOwnProperty(i)) {
                    publicConfiguration[i] = meConf[i];
                }
            }
        }
    }
    return publicConfiguration;
}


function getPrivateConfiguration(){
    if ( !privateConfigurationInitialized ) {
        privateConfigurationInitialized = true;

        var pubConf = getPublicConfiguration();

        if ( pubConf != null ){
            for ( var j in pubConf ){
                privateConfiguration[j] = pubConf[j];
            }
        }
        if ( meConf != null ){
              for ( var i in meConf ){
                  privateConfiguration[i] = meConf[i];
              }
        }
    }
    return privateConfiguration;

}


exports.sendPublicConfiguration = function( req, res ){
    var name = req.param("name") || "conf";

    res.send( "window." + name + " = " + JSON.stringify(getPublicConfiguration()) + ";");
};


var prConf = getPrivateConfiguration();
if ( prConf != null ){
    for ( var i in prConf ){
        if ( prConf[i] === undefined ){

            throw new Error("undefined configuration [" + i + "]");
        }
        exports[i] = prConf[i];
    }
}


return exports;

説明

  • undefined このプロパティは必須です
  • null オプションであることを意味します
  • meConf-現在、コードはのファイルをターゲットにしていますappmeConf対象となるオーバーライドファイルですconf/dev-これは私のvcsによって無視されます。
  • publicConfiguration -フロントエンドとバックエンドから表示されます。
  • privateConfiguration -バックエンドからのみ表示されます。
  • sendPublicConfiguration-パブリック構成を公開し、それをグローバル変数に割り当てるルート。たとえば、以下のコードはパブリック構成をフロントエンドのグローバル変数myConfとして公開します。デフォルトでは、グローバル変数名を使用しますconf

    app.get( "/ backend / conf"、require( "conf")。sendPublicConfiguration);

オーバーライドのロジック

  • privateConfigurationはpublicConfigurationとマージされ、次にmeConfとマージされます。
  • publicConfigurationは、オーバーライドがあるかどうか各キーをチェックし、そのオーバーライドを使用します。このように、私たちは何も非公開にしていません。

環境サポートの追加

「環境サポート」は役に立たないと思いますが、誰かが役に立つかもしれません。

環境サポートを追加するには、meConf requireステートメントを次のように変更する必要があります(疑似コード)

if(environment == "production"){meConf = require( "../ conf / dev / meConf")。production; }

if(environment == "development"){meConf = require( "../ conf / dev / meConf")。development; }

同様に、環境ごとにファイルを持つことができます

 meConf.development.js
 meConf.production.js

正しいものをインポートします。残りのロジックは同じままです。


それがundefined本当に「必須」をnull意味し、「オプション」を意味することはひどく明白ではありません。黄色の箱はプラスチック用、青の箱はスクラップ紙用ですか?結構ですが、そのゴミを捨てる前にマニュアルを読まなければなりませんでした。
フロー

この規則を使用する必要はありません。私はそれが便利だと思い、チームにそれを使用するように指示しますが、この機能を明らかに削除することができます。
モグラビ男13年

3

一般的な.jsonファイルよりも柔軟性を求めたが、依存関係を必要とするライブラリに抽象化したくなかったため、私が使用した代替例は次のようなものです。基本的に、すぐに呼び出された関数をエクスポートすると、設定したい値を持つオブジェクトが返されます。柔軟性が大幅に向上します。

     module.exports = function(){
       switch(node_env){
         case 'dev':
           return
           { var1 = 'development'};
         }
    }();

ここに完全な例を含むより良い説明があります。Node.jsでの構成ファイルの使用


3

私はこれが本当に古い記事であることを知っています。しかし、環境変数を構成するためのモジュールを共有したいのですが、これは非常に柔軟なソリューションだと思います。ここにモジュールjson-configuratorがあります

var configJson = {
  'baseUrl': 'http://test.com',
  '$prod_baseUrl': 'https://prod.com',
  'endpoints': {
    'users': '<%= baseUrl %>/users',
    'accounts': '<%= baseUrl %>/accounts'
    },
  foo: 'bar',
  foobar: 'foobar',
  $prod_foo: 'foo in prod',
  $test_foo: 'foo in test',
  deep:{
    veryDeep: {
      publicKey: 'abc',
      secret: 'secret',
      $prod_secret: 'super secret'
    }
  }
};

var config = require('json-configurator')(configJson, 'prod');

console.log(config.deep.veryDeep.secret) 
// super secret 

console.log(config.endpoints.users)
// https://prod.com/users 

次に、を使用process.env.NODE_ENVして、環境のすべての変数を取得できます。


2

加えて、ここで、nconfモジュールで述べたこの答え、およびノード設定で述べたこの答えもあるノードiniparserIniReader簡単.INI設定ファイルパーサーであるように見えます。


win-iniファイルに戻る方法はありませんiniparser... 2013年にconfigのセクションを解析する方法を知っていることを誇らしげに強調しています... より深いネストが必要な場合はどうでしょ[foo/bar]うか。[foo\bar]bar.baz=42bar/baz=42bar\baz=42bar:baz=4242数字はどうやってわかりますか?それはすべて数字のテキストである可能性があります!—XMLを投げる、YAMLを投げる、WIN.INIを投げる、JSONを受け入れる、心配はいりません。
フロー


1

pconfを使用できます:https ://www.npmjs.com/package/pconf

例:

var Config = require("pconf");
var testConfig = new Config("testConfig");
testConfig.onload = function(){

  testConfig.setValue("test", 1);
  testConfig.getValue("test");
  //testConfig.saveConfig(); Not needed

}

1

ここに、この記事から着想を得たきちんとしたアプローチがあります。ユビキタスlodashパッケージ以外の追加パッケージは必要ありません。さらに、ネストされたデフォルトを環境固有の上書きで管理できます。

まず、次のようなパッケージルートパスにconfigフォルダーを作成します。

package
  |_config
      |_ index.js
      |_ defaults.json
      |_ development.json
      |_ test.json
      |_ production.json

これがindex.jsファイルです

const _ = require("lodash");
const defaults = require("./defaults.json");
const envConf = require("./" + (process.env.NODE_ENV || "development") + ".json" );
module.exports = _.defaultsDeep(envConf, defaults);

次に、defaults.jsonがあると仮定します

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value3",
    "confKey4": "value4"
  }
}

とdevelopment.jsonのように

{
  "confKey2": {
    "confKey3": "value10",
  }
}

あなたがconfig = require('./config')ここでやれば、あなたは何を得るでしょう

{
  "confKey1": "value1",
  "confKey2": {
    "confKey3": "value10",
    "confKey4": "value4"
  }
}

環境固有のファイルで定義されているものを除いて、すべてのデフォルト値を取得することに注意してください。したがって、構成階層を管理できます。を使用defaultsDeepすると、デフォルトをネストすることもできます。



0

ここで提案された解決策のいくつかを試してみましたが、それらに満足していなかったので、私は自分のモジュールを作成しました。いわゆるmikro-configれ、主な違いは、構成よりも規約が優先されるため、モジュールを必要とするだけで使用を開始できることです。

構成は、プレーンjsまたは/configフォルダーのjsonファイルに保存します。最初にdefault.jsファイルをロードし、次に/configディレクトリから他のすべてのファイルをロードし、次に$NODE_ENV変数に基づいて環境固有の構成をロードします。

また、local.jsまたは環境固有のローカル開発のために、この構成をオーバーライドすることもできます/config/env/$NODE_ENV.local.js

あなたはそれをここで見てみることができます:

https://www.npmjs.com/package/mikro-config

https://github.com/B4nan/mikro-config


0

長い間、私はここでソリューションで言及されているアプローチを使用していました。ただし、クリアテキストでの秘密のセキュリティについて懸念があります。上で別のパッケージを使用しconfigて、セキュリティビットを処理できます。

これをチェックしてくださいhttps : //www.attosol.com/secure-application-secrets-using-masterkey-in-azure-key-vault/


このサービスの料金を支払うためにAzureにサブスクライブする必要があるのはなぜですか?なぜansible-vaultを使わないのですか?もう1つ:ソースリポジトリにクリアテキストの資格情報を含む構成ファイルを投稿する人はいないと思います。環境変数を使用するか、読み取り専用権限を持つファイルに秘密データを配置します。
Yasser Sinjab 2017

サードパーティの場所からデータを読み取ってデコードし、サービスにその極秘データを使用させることができれば、ハッカーがコンピュータにアクセスできれば、ハッカーがまったく同じことを行う可能性があります。作業量は増えます(時間がかかります)が、最終的には保護されません。サーバーが侵入された場合、サーバー上にあるものはすべて公開されていると想像してください。
Alexis Wilke、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.