Express x nodemonでdotenvを環境別にファイル読込する方法

環境

  • ts-node
  • express
  • nodemon
  • typescript
  • dotenv

やりたいこと

Viteみたいに、viteを起動するときに環境を指定すると、環境別のenvファイルが読み込まれる。以下のようなことをExpress JSでもやりたい。

pacakge.json:

  "scripts": {
    "dev": "vite --mode dev",
  },

terminal:

npm run dev -> .env.dev が読み込まれる

対応

Node起動時にdotenv側でファイル読込の指定ができるため、それを利用する。

このファイルはデフォルトで読み込まれる。以下を記述
.env:

MY_ENV="this is .env"

今回このファイルを読み込めるようにする。以下を記述
.env.dev:

MY_ENV_DEV="this is .env.dev"

app.ts:

import * as dotenv from 'dotenv'; // expressより先にimportする
import createHttpError from "http-errors";
import express from "express";

・・・省略・・・

dotenv.config()

console.log(process.env.MY_ENV); // => this is .env
console.log(process.env.MY_ENV_DEV); // this is .env.dev
> 
module.exports = app;

pacakage.json:

  "scripts": {
    "start": "node ./bin/www",
    "dev": "nodemon -r dotenv/config app.ts dotenv_config_path=.env.dev"
  },

「nodemon -r dotenv/config <監視するファイル> dotenv_config_path=<読み込むファイル>」で指定できるっぽい。

ターミナル:

% npm run dev
start express server
[nodemon] restarting due to changes...
[nodemon] starting `ts-node -r dotenv/config app.ts dotenv_config_path=.env.dev`
this is .env
this is .env.dev

補足

pacakage.jsonを変更したら、nodeを再起動しないと反映されないため要注意。

参考

以下にコマンドラインオプションとして、dotenv_config_pathのことが書いてある。
dotenv - Preload