Dev Study
NestJS コース

17. 環境変数と ConfigModule

DB の接続先や API キーのような環境ごとに変わる値は、コードに直書きせず環境変数で渡します。NestJS では @nestjs/config パッケージの ConfigModule.forRoot() を AppModule に登録すると .env ファイルが読み込まれ、ConfigService を注入して config.get("KEY") で値を取り出せます。

実務では isGlobal: true を付けてアプリ全体で使えるようにするのが定番です。これを付けないとモジュールごとに ConfigModule を import する必要があり、付け忘れによる注入エラーの原因になります。

つまずきポイントは、環境変数がすべて文字列であることです。PORT=3000 と書いても get で取れるのは "3000" という文字列なので、数値が必要なら明示的に変換します。また .env は秘密情報を含むため、Git にコミットしない運用が大前提です。

サンプルコード(フレームワーク環境が必要なため表示のみ)

// .env ファイル:
// DATABASE_URL=postgres://localhost:5432/app
import { Module, Injectable } from "@nestjs/common";
import { ConfigModule, ConfigService } from "@nestjs/config";

@Module({
  // isGlobal: true でアプリ全体から ConfigService を使える
  imports: [ConfigModule.forRoot({ isGlobal: true })],
})
export class AppModule {}

@Injectable()
export class DatabaseService {
  constructor(private readonly config: ConfigService) {}

  connect() {
    const dbUrl = this.config.get<string>("DATABASE_URL");
    console.log("接続先: " + dbUrl);
  }
}
公式ドキュメントで詳しく ↗