NestJSで環境変数を読み込む

必要なライブラリのインストール

shell
npm i --save @nestjs/config

configuration.ts を作成

shell
mkdir -p src/config
touch src/config/configration.ts

configuration.ts を以下のように編集します。

src/config/configration.ts
export default () => ({
  app: {
    port: parseInt(process.env.APP_PORT, 10) || 3000,
  },
  database: {
    type: process.env.TYPEORM_CONNECTION,
    host: process.env.TYPEORM_HOST,
    port: parseInt(process.env.TYPEORM_PORT, 10) || 5432,
    username: process.env.TYPEORM_USERNAME,
    password: process.env.TYPEORM_PASSWORD,
    database: process.env.TYPEORM_DATABASE,
    synchronize: process.env.TYPEORM_SYNCHRONIZE === 'true',
  },
});

.env ファイルを作成する

.env ファイルを作成します。作成した .env は自動で読み込まれます。

.env
# App Configration
APP_PORT=3000

# Database ORM configuration
TYPEORM_CONNECTION=mysql
TYPEORM_HOST=localhost
TYPEORM_PORT=3306
TYPEORM_USERNAME=nestjs
TYPEORM_PASSWORD=password
TYPEORM_DATABASE=nestjs
TYPEORM_SYNCHRONIZE=false

# TypeORM internals
TYPEORM_ENTITIES=src/**/*.entity.ts,dist/**/*.entity.js
TYPEORM_MIGRATIONS_DIR=src/migrations
TYPEORM_MIGRATIONS=src/migrations/*.ts

app.module.ts で ConfigModule の依存関係を定義する

app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import configration from './config/configration';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      load: [configration],
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

環境変数が読み込まれていることを確認する

main.tsconsole に環境変数の値を表示してみます。

main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ConfigService } from '@nestjs/config';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const configService = app.get(ConfigService);
  const appPort = configService.get<number>('app.port');
  await app.listen(appPort);
  console.log(`App is running on: ${await app.getUrl()}`);
}
bootstrap();

取得したい値は configService.get('app.port') のようにして取得できます。

const appPort = configService.get<number>('app.port');

のように、型を設定することもできます。

'app.port' のところに書いた文字列は、 configuration.ts で作成したオブジェクトの形に沿っています。database.type, database.username のようにすれば、その他の値も取得できます。

なお、デフォルトのプロジェクト設定だと、 NestJS は .env.gitignore に登録していないので、忘れずに追加しておきましょう。

shell
echo ".env" >> .gitignore

参考