albatrosary's blog

UI/UXとエンタープライズシステム

NestJS の実行環境毎に設定を変える

@nestjs/config ではなくdotenv 。@nestjs/config は内部的に dotenv も使ってます

github.com

dotenv のインストール

npm i dotenv -S
npm i @types/dotenv -D

※ Windows との差異を埋めるには cross-env - npm

設定

例えば

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

import { config } from "dotenv"

async function bootstrap() {
  config();
  …
}
bootstrap();

これで process.env には設定が入っている

読み込ませるファイルを切り替えたい場合は

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

import { config } from "dotenv"

async function bootstrap() {
  config({path: '.develop.env'});
  …
}
bootstrap();

※ config().parsed でJSONで出力する

注意

読み込む .env は先勝ち

  config();
  config({path: '.develop.env'});

この場合は .env が設定されて .develop.env では上書きされない

TypeORMの接続情報の変更を簡単に済ませたかったので

// environment.ts
import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const development: TypeOrmModuleOptions = {
  type: 'mysql',
  host: '',
  port: 0000,
  username: '',
  password: '',
  database: '',
  entities: [],
  synchronize: true,
};

export const production: TypeOrmModuleOptions = {
  type: 'mysql',
  extra: {
    socketPath: '/cloudsql/xxxxxxxxxxxxxxx',
  },
  username: '',
  password: '',
  database: '',
  entities: [],
  synchronize: true,
};

と定義してこれを

import * as env from './environment';

@Module({
  imports: [TypeOrmModule.forRoot(env[process.env.NODE_ENV])],
  providers: [AppService],
  controllers: [AppController],
})

って呼び出しました。

参考

環境(NODE_ENV)は

  • production
  • development
  • staging
  • test
  • local