コンテンツにスキップ

NestJS で環境変数を扱う

.env ファイルを読み込めるようにする

Configuration | NestJS - A progressive Node.js framework

1
$ npm i @nestjs/config

プロジェクトのルートに.envファイルを作成する。

.env
1
2
3
4
5
6
PORT=3000
DATABASE_HOST=localhost
DATABASE_PORT=3306
DATABASE_USERNAME=user
DATABASE_PASSWORD=password
DATABASE_NAME=db

process.env経由で参照できる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
import { TypeOrmModule } from "@nestjs/typeorm";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { Todo } from "./todos/entities/todo.entity";
import { TodosModule } from "./todos/todos.module";

@Module({
  imports: [
    ConfigModule.forRoot(),
    TypeOrmModule.forRoot({
      type: "mysql",
      host: process.env.DATABASE_HOST,
      port: parseInt(process.env.DATABASE_PORT),
      username: process.env.DATABASE_USERNAME,
      password: process.env.DATABASE_PASSWORD,
      database: process.env.DATABASE_NAME,
      entities: [Todo],
      synchronize: true,
    }),
    TodosModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

実行時に.env ファイルを切り替えられるようにする

開発環境では.env.developmentを参照し、本番環境では.env.productionを参照する場合を示す。

1
$ npm i -D dotenv-cli
1
2
3
4
5
6
{
  "scripts": {
    "dev": "dotenv -e .env.development.local -- nest start --watch",
    "prod": "npm run build && dotenv -e .env.production.local -- node dist/main"
  }
}

--をつけることでそれ以降の引数が実行するコマンドに紐づくことを伝える。

prod の方のコマンドは動作確認していない。