Node.js のプログラムから環境変数を参照するには process.env
を参照します。
ユーザー設定を環境変数で行うようにしているアプリはよくあるのですが、たかが 1 つのアプリのために環境変数を設定するのは嫌だというユーザーは少なからずいます(設定がどこで行われているのかわかりにくいという理由もあります)。
dotenv
モジュールを使用すると、カレントディレクトリに置かれた .env
ファイルを読み込み、そこに記述されたキー&バリューのペアを process.env
経由で参照できるようになります。
つまり、ユーザはアプリの設定を、従来通り環境変数で行うこともできるし、.env
ファイルでも行うことができるようになります。
環境変数を使ってアプリの挙動を変えるような実装をしている場合は、.env
ファイルによる設定もサポートしておくと親切です。
クラウドサービスと連携するアプリケーションなどは、接続キー などの情報を .env
ファイルで指定できるようにしているものがよくあります。
dotenv
モジュールは npm
コマンドで下記のようにインストールすることができます。
インストールされたモジュールは node_modules
ディレクトリに格納されます。
$ npm install dotenv
$ npm install dotenv --save # package.json に依存情報を追記する場合
まず、サンプルの設定ファイルとして、プロジェクトのルートディレクトリに、下記のような .env
ファイルを作成します。
# これはコメント行
KEY1=VALUE1
KEY2=VALUE2
KEY3=VALUE3
.env
ファイルの内容を読み込んで、process.env
オブジェクトのプロパティとして参照できるようにするには、アプリの最初の方で下記のように実行します。
require('dotenv').config();
基本的にはやることはこれだけです。
仮に、.env
ファイルが見つからない場合は、単純に無視されるだけなので、上記のコードは安心して入れておくことができます。
後は、通常の環境変数と同様に process.env
オブジェクト経由で値を参照するだけです。
require('dotenv').config();
console.log(process.env.KEY1); //=> VALUE1
console.log(process.env.KEY2); //=> VALUE2
console.log(process.env.KEY3); //=> VALUE3
より実践的には、下記のように、設定が正しく行われているかの確認をするのがよいでしょう(これは、dotenv
モジュールを使用しない場合でも同様ですが)。
require('dotenv').config();
if (typeof process.env.KEY1 == 'undefined') {
console.error('Error: "KEY1" is not set.');
console.error('Please consider adding a .env file with KEY1.');
process.exit(1);
}
console.log(process.env.KEY1); //=> VALUE1
#
で始まる行はコメントだとみなされますKEY1=AAA BBB CCC
も OK)。シングルクォートやダブルクォートで囲んでもよいですKEY1=
とすると、{ KEY1: '' }
になる)KEY1=' AAA '
)utf8
で保存します(dotenv.config()
のオプション encoding
で変更できます)dotenv.config()
によって返されるオブジェクトの parsed
プロパティを参照すると、.env
ファイルで設定されているキー&バリューをオブジェクトの形で参照することができます。
const dotenv = require('dotenv');
const result = dotenv.config();
console.log(result.parsed);
$ node sample.js
{ KEY1: 'VALUE1', KEY2: 'VALUE2', KEY3: 'VALUE3' }
ちなみに、.env
ファイルが存在しない場合は result は undefined
になり、.env
ファイルの記述が空っぽのときは result は {}
(空オブジェクト)になります。
デフォルトでは、.env
ファイルの読み込みパスは下記のように構築されるため、node
コマンドを実行したときのカレントディレクトリに置かれた .env
ファイルが読み込まれます。
path.resolve(process.cwd(), '.env');
通常はあまり問題になることはありませんが、js
ファイルが置かれたディレクトリ以外から node
コマンドを実行する場合(例: node myapp/main.js
みたいに実行した場合)は、.env
ファイルが読み込めずに混乱するかもしれません。
カレントディレクトリではなく、プログラム(.js
ファイル)自体が置かれたディレクトリ内にある .env
ファイルを読み込むようにするには、dotenv.config()
の path
オプションで下記のようにパス指定します。
const ENV_PATH = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_PATH });
dotenv.config()
のオプションで debug
フラグを true
に設定しておくと、dotenv
の処理内容が表示されるようになります。
これにより、.env
ファイルの記述方法のミスなどを発見できます。
require('dotenv').config({ debug: true });
$ node sample.js
[dotenv][DEBUG] did not match key and value when parsing line 1: THIS_IS_AN_INVALID_LINE
環境変数と、.env
ファイルに同じ名前のキーが設定されている場合は、環境変数の設定の方が優先されます。
.env
ファイルに設定した設定が反映されておらず、別の値が設定されているような場合は、環境変数の設定を確認してみてください。
.env
ファイルは、ユーザ固有の設定や、Web API 接続用のキーなどの設定を行うために使用されます。
Git などのバージョン管理システムには、.env
ファイルをコミットしないように気を付けてください。
Git を使用する想定であれば、プロジェクトのルートに置いた .gitignore
ファイルに下記のようなエントリを追加しておきましょう。
.env
これで .env
ファイルが Git の管理化から外されます(git status
などでコミット候補として表示されなくなります)。