dotenvでの環境変数

 

ブログに書いた記事を少しまとめた記事。

dotenvはNode.jsで利用される環境変数を読み込むためによく使われているライブラリ。 .envファイルに書き込んだ環境変数を読み込んで、JSファイルでprocess.envから取得できるようになる。

簡単な例としては以下。

.envファイル

MY_ENV=myvalue

index.jsファイル

require('dotenv').config();

console.log(process.env.MY_ENV); // myvalue

環境変数がどのようにJSファイルで扱われるか

色々試したコードはGitHubにおいた。

JSファイルでは全て文字列型になる

.envファイルで文字列ではなく、数値やbooleanのつもりで渡したときにもJSファイルでは文字列型になることに注意。

STRING_ENV="string value"
NUMBER_ENV=123
BOOLEAN_ENV=true

index.jsファイルでconsole.logを使って確認してみると、NUMBER_ENVおよびBOOLEAN_ENVの両方とも文字列型(string)と表示される。

require('dotenv').config();

const stringEnv = process.env.STRING_ENV;
console.log('STRING_ENV type:', typeof stringEnv); // string
console.log('STRING_ENV:', stringEnv); // string value

const numberEnv = process.env.NUMBER_ENV;
console.log('NUMBER_ENV type:', typeof numberEnv); // string
console.log('NUMBER_ENV:', numberEnv); // 123

const booleanEnv = process.env.BOOLEAN_ENV;
console.log('BOOLEAN_ENV type:', typeof booleanEnv); // string
console.log('BOOLEAN_ENV:', booleanEnv); // true

文字列型から数値型への変換はNumberオブジェクトを利用したり、boolean型には===を使って比較したりすることで変換する。

複数行

v15以降では複数行の環境変数が利用できる。 必ずクォーテーションで囲むこと。囲まなかった場合は後述。

MULTI_ENV="THIS IS MULTILINE
ENV VALUE
END"
require('dotenv').config();

const multiEnv = process.env.MULTI_ENV;
console.log('MULTI_ENV:', multiEnv); // THIS IS MULTILINE
                                     // ENV VALUE
                                     // END

\nを使っても複数行の環境変数が利用できる。

ALT_MULTI_ENV="THIS IS ALT MULTILINE\nENV VALUE\nEND"
require('dotenv').config();

const altMultiEnv = process.env.ALT_MULTI_ENV;
console.log('ALT_MULTI_ENV:', altMultiEnv); // THIS IS ALT MULTILINE
                                            // ENV VALUE
                                            // END

ダブルクォーテーションで囲わなかったため、複数行にならないパターンを記述しておく。

FAIL_MULTI_ENV=THIS IS FAIL MULTILINE
ENV VALUE
END
FAIL_ALT_MULTI_ENV=THIS IS ALT MULTILINE\nENV VALUE\nEND
require('dotenv').config();

const failMultiEnv = process.env.FAIL_MULTI_ENV;
console.log('FAIL_MULTI_ENV:', failMultiEnv); // THIS IS FAIL MULTILINE

const failAltMultiEnv = process.env.FAIL_ALT_MULTI_ENV;
console.log('FAIL_ALT_MULTI_ENV:', failAltMultiEnv); // THIS IS ALT MULTILINE\nENV VALUE\nEND

クォーテーションとエスケープ

文字列は、.envファイル内でダブルクォーテーション(")で囲ってもシングルクォーテーション(')で囲っても、囲わなくても同じ。

また、クォーテーションを使いたい場合には\を使ってエスケープすること。

STRING_ENV="string value"
NO_QUOTATION_ENV=no quotation env
SINGLEQUOTATION_ENV='singleenv'
ESCAPE_ENV=\"escapeenv\"
require('dotenv').config();

const stringEnv = process.env.STRING_ENV;
console.log('STRING_ENV:', stringEnv); // string value

const noQuotationEnv = process.env.NO_QUOTATION_ENV;
console.log('NO_QUOTATION_ENV:', noQuotationEnv); // no quotation env

const singleQuotationEnv = process.env.SINGLEQUOTATION_ENV;
console.log('SINGLEQUOTATION_ENV:', singleQuotationEnv); // singleenv

const escapeEnv = process.env.ESCAPE_ENV;
console.log('ESCAPE_ENV:', escapeEnv); // \"escapeenv\"

コメント

.envファイルでは#を使うことでそれ以降はコメントになり、変数としては渡されない。 #を使いたい場合にはダブルクォーテーションで囲うこと。

COMMENT_ENV=VALUEISHERE # comment is here
COMMENT_IN_ENV="VALUE#IS#HERE" # comment is here
require('dotenv').config();

const commentEnv = process.env.COMMENT_ENV;
console.log('COMMENT_ENV:', commentEnv); // VALUEISHERE

const commentInEnv = process.env.COMMENT_IN_ENV;
console.log('COMMENT_IN_ENV:', commentInEnv); // VALUE#IS#HERE