読み込みファイルの場所
configはアプリケーションのルートから見て./config
の場所のディレクトリの中にある設定ファイルを読み込みます。
この設定は環境変数NODE_CONFIG_DIR
で上書き可能です。また、requireする前であればnodeプログラムの中でも指定する事が出来ます。
process.env["NODE_CONFIG_DIR"] = __dirname + "/configDir/";
const config = require("config");
#読み込みファイル名
設定ファイルの命名規則。
default.EXT
default-{instance}.EXT
{deployment}.EXT
{deployment}-{instance}.EXT
{short_hostname}.EXT
{short_hostname}-{instance}.EXT
{short_hostname}-{deployment}.EXT
{short_hostname}-{deployment}-{instance}.EXT
{full_hostname}.EXT
{full_hostname}-{instance}.EXT
{full_hostname}-{deployment}.EXT
{full_hostname}-{deployment}-{instance}.EXT
local.EXT
local-{instance}.EXT
local-{deployment}.EXT
local-{deployment}-{instance}.EXT
(任意のファイル名で上書き可能)
ファイル名で使われる変数
- EXTは拡張子。.yml .yaml .xml .coffee .cson .properties .json .json5 .hjson .ts .js が設定可能
- tsとpropertiesファイルの読み込みには、同名のモジュールが必要。モジュールなしでファイルがあると読み込みエラーが出るので注意。
- 読み込み処理はこの辺。 https://github.com/lorenwest/node-config/blob/2f7a82e2a108c0245f1906e06a8248323df6577d/lib/config.js#L573
- instanceは設定
NODE_APP_INSTANCE
の値。これは環境変数か、コマンドラインオプションで指定できる- コマンドラインオプションは
--NODE_APP_INSTANCE=xxx
で指定出来る。 https://github.com/lorenwest/node-config/blob/2f7a82e2a108c0245f1906e06a8248323df6577d/lib/config.js#L1541 このあたりに書いてある
- コマンドラインオプションは
- deploymentは初期値は
development
この値を求めるロジックは以下の通り。NODE_CONFIG_ENV
が指定されていたらそれを、指定されていなかったらNODE_ENV
を。それも指定されていなかったらdevelopment
という値が入る。また、入っていた値がカンマ区切りの場合はそれで複数指定出来る。以下のコードで、NODE_ENVは最終的に配列になる。URLはこのあたり https://github.com/lorenwest/node-config/blob/2f7a82e2a108c0245f1906e06a8248323df6577d/lib/config.js#L535
NODE_ENV = util.initParam('NODE_ENV', 'development');
NODE_ENV = util.initParam('NODE_CONFIG_ENV', NODE_ENV);
NODE_ENV = NODE_ENV.split(',');
- short_hostnameとfull_hostnameのコードは以下の通り。設定osモジュールのhostname()、HOST設定、HOSTNAME設定から最初にあった値を取る。shortの方は、ピリオドで区切った一番最初。
HOST = util.initParam('HOST');
HOSTNAME = util.initParam('HOSTNAME');
var hostName = HOST || HOSTNAME;
if (!hostName) {
var OS = require('os');
hostName = OS.hostname();
}
var short_hostname = hostName.split('.')[0];
var full_hostname = hostName;
localファイルの注意点
local ファイルはバージョンコントロールに入れるべきではありません との事。
ファイルの中身(独自研究)
ファイルの中身はkey-value形式に展開される模様。
オブジェクトはマージされる。が、配列は置き換えされるので注意。
ファイルを読み込む時に//
形式と/* ... */
形式のコメントは削除されるので、通常この形式のコメントが使えないjsonでもコメントを書くことが出来ます。
バックスラッシュはpropertiesでもjsonでもエスケープ必須なので注意
ファイルの読み込み
基本的な読み込み方法は以下の通り。
const config = require('config');
config.get("xxx")
戻り値に数字、nullが入る場合もある。json型の場合は数字か文字列型かを指定出来るが、properties型のファイルではそれを指定する事は出来ない?
config.xxx
という指定も出来るが、これは互換性の為に残っているので使うべきではない。
config.has("xxx")
で値の存在確認が出来る。
キーはあるけど値が無い。という場合はnullが帰ってくる。例えばproperties型のファイルでは、キーだけの定義が出来る。
キーに使えない文字
get has util
というキーは予約済みなので使えない。
環境変数で値を上書き
NODE_CONFIG
という環境変数、もしくはコマンドライン引数でjson型の設定を渡すことが出来る。ダブルクオートを指定する方法がシェルによって異なるので注意。