2022-12-29に投稿

dotenvで.envファイルから取得した環境変数は文字列型になる

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

簡単な例としては以下のとおりです。

.envファイル

MY_ENV=myvalue

index.jsファイル

require('dotenv').config();

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

本題

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

以下のような.envファイルとJSファイルを用意して確認しました。
(他にも気になる部分やdotenvのドキュメントに書かれていたものを使ったコードはGitHubに置きました。)

.envファイルは下のようにしています。
NUMBER_ENVおよびBOOLEAN_ENVはこのままであればJSファイルでは数値型とboolean型になりそうな気もします。

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型には===を使って比較したりすることで変換できます。

ついでに、今まで知らなかったdotenvの機能として、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

おわり

なんとなくで利用していたdotenvモジュールだったので、今回気がつけてよかったです。
コードを書いているとき、process.env.MY_ENVのように取り出した環境変数は文字列型だ、とVS Codeが指摘してくれたので気が付きました。

よく使うライブラリもあまり勉強していないのがよくわかりました。。。

Originally published at s1r-j.hatenablog.com
ツイッターでシェア
みんなに共有、忘れないようにメモ

s1r-J

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント