Help us understand the problem. What is going on with this article?

Node.jsで設定ファイルを読み込む

More than 5 years have passed since last update.

Node.jsでアプリを作った時に、パラメータを設定ファイルに書き出して開発環境やステージング、プロダクション環境などで切り替えたことがあります。この時に使用できるのが、node-configモジュール。

設定ファイルとして対応しているフォーマット

  • Javascript Object Notation - .json
  • Javascript5 Object Notation - .json5
  • Yet another markup language - .yaml
  • Javascript - .js
  • CoffeeScript - .coffee
  • CoffeeScript Object Notation - .cson
  • Properties file format - .properties

ファイルの読み込み順

通常は実行しているアプリの./configディレクトリ下の設定ファイルを読み込みます。また、$NODE_ENV環境変数の値を見て読み込むファイルを切り替える様にすることもできます。

./configディレクトリ以下のファイルは次の順番で読み込まれる様です。

default.EXT
default-{instance}.EXT
{hostname}.EXT
{hostname}-{instance}.EXT
{deployment}.EXT
{deployment}-{instance}.EXT
{hostname}-{deployment}.EXT
{hostname}-{deployment}-{instance}.EXT
local.EXT
local-{instance}.EXT
local-{deployment}.EXT
local-{deployment}-{instance}.EXT  
  • .EXT 対応しているフォーマットの拡張子
  • {instance} Multi-Instnance Deploymentsのためのオプションのインスタンス名文字列
  • {hostname} サーバーのホスト名。$HOST or $HOSTNAME環境変数の値
  • {deproyment} デプロイメント名。$NODE_ENV環境変数の値

defalut.EXTは他のファイルでパラメータを上書きしてマージすることができます。

サンプル

準備

$ mkdir sample-config
$ cd sample-config/
$ mkdir config
$ npm install config
config@1.8.1 node_modules/config
$ npm install js-yaml
js-yaml@3.2.3 node_modules/js-yaml
├── esprima@1.0.4
└── argparse@0.1.15 (underscore@1.4.4, underscore.string@2.3.3)
$ ls
config      node_modules
$ cd config

設定ファイル作成

configディレクトリ以下に設定ファイルを作成します。

default.yaml

config:
    fname: "defalut.yaml"
    defaultParam: "default.yaml parameter"

hostname.yaml

config:
    fname: "hostname.yaml"
    hostnameParam: "hostname.yaml parameter"

myDevelopment.yaml

config:
    fname: "myDevelopment.yaml"
    myDevelopmentParam: "myDevelopment.yaml parameter"

hostname-myDevelopment.yaml

config:
    fname: "hostname-development.yaml"
    hostDevParam: "hostname-development.yaml parameter"

local.yaml

config:
    fname: "local.yaml"
    localParam: "local.yaml parameter"

設定ファイルを読み込む実行スクリプトを作成

app.js

ConfigFile = require('config');

console.log(ConfigFile.config);

// 全ての設定ファイルで共通項目
console.log("config.fname              : " + ConfigFile.config.fname);
// default.yaml only
console.log("config.defaultParam       : " + ConfigFile.config.defaultParam);
// hostname.yaml only
console.log("config.hostnameParam      : " + ConfigFile.config.hostnameParam);
// myDevelopment.yaml only
console.log("config.myDevelopmentParam : " + ConfigFile.config.myDevelopmentParam);
// hostname-myDevelopment.yaml only
console.log("config.hostDevParam       : " + ConfigFile.config.hostDevParam);
// local.yaml only
console.log("config.localParam         : " + ConfigFile.config.localParam);

実行する

$HOST(or $HOSTNAME)、$NODE_ENV未設定

環境変数を設定しないで事項すると、次の通り。

$ node app.js
{ fname: 'local.yaml',
  defaultParam: 'default.yaml parameter',
  localParam: 'local.yaml parameter' }
config.fname              : local.yaml
config.defaultParam       : default.yaml parameter
config.hostnameParam      : undefined
config.myDevelopmentParam : undefined
config.hostDevParam       : undefined
config.localParam         : local.yaml parameter

default.yaml、local.yamlでマージされている。
両ファイルの共通項目はファイルの読み込み順に則って、local.yamlの値で上書きされる。

$HOST環境変数を設定

$ export HOST=hostname
$ node app.js
{ fname: 'local.yaml',
  defaultParam: 'default.yaml parameter',
  hostnameParam: 'hostname.yaml parameter',
  localParam: 'local.yaml parameter' }
config.fname              : local.yaml
config.defaultParam       : default.yaml parameter
config.hostnameParam      : hostname.yaml parameter
config.myDevelopmentParam : undefined
config.hostDevParam       : undefined
config.localParam         : local.yaml parameter

hostname.yamlが読み込み対象となる。

$NODE_ENV環境変数を設定

$ export HOST=hostname
$ export NODE_ENV=myDevelopment

$ node app.js
{ fname: 'local.yaml',
  defaultParam: 'default.yaml parameter',
  myDevelopmentParam: 'myDevelopment.yaml parameter',
  hostnameParam: 'hostname.yaml parameter',
  hostDevParam: 'hostname-development.yaml parameter',
  localParam: 'local.yaml parameter' }
config.fname              : local.yaml
config.defaultParam       : default.yaml parameter
config.hostnameParam      : hostname.yaml parameter
config.myDevelopmentParam : myDevelopment.yaml parameter
config.hostDevParam       : hostname-development.yaml parameter
config.localParam         : local.yaml parameter

$HOSTと$NODE_ENVに設定してファイルの情報が読み込まれている。

runtime.json

実行後にconfigディレクトリにruntime.jsonファイルができている場合があります。
これは、node-configが自動で設定を反映してくれるファイルです。

詳細は、GitHubにあるnode-cofigのWikiを見ると色々書いてあります。(英語ですが・・・)

_daisuke
個人的な技術系の覚え書きなどを公開していきます。 最近の興味はAWS / IBM Bluemix。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした