Field Notes
Engineering

NestJS Environment Config

Loading configuration for multiple environments.

1 min read

app.module.ts

javascript
import {typeOrmConfigAsync} from './config/database.configuration';

@Module({
  imports: [
    TypeOrmModule.forRootAsync(typeOrmConfigAsync)
  ]
})

/config/database.configuration

javascript
import { ConfigModule, ConfigService } from "@nestjs/config";
import { TypeOrmModuleAsyncOptions, TypeOrmModuleOptions } from "@nestjs/typeorm";

let envFilePath:string[] = ['.env'];
export const IS_DEV:boolean = process.env.RUNNING_ENV !== 'prod';
if (IS_DEV) {
  envFilePath.unshift('.env.dev');
} else {
  envFilePath.unshift('.env.prod');
}


export default class databaseConfiguration {
  static getOrmConfig(configService: ConfigService): TypeOrmModuleOptions {
    return {
      type: 'mysql',
      host: configService.get('DB_HOST'),
      port: +configService.get<number>('DB_PORT'),
      username: configService.get('DB_USERNAME'),
      password: configService.get('DB_PASSWORD'),
      database: configService.get('DB_NAME'),
      autoLoadEntities: true,
      synchronize: true,
    };
  }
}

export const typeOrmConfigAsync: TypeOrmModuleAsyncOptions = {
  imports:[ConfigModule.forRoot({
    envFilePath,
    isGlobal: true,
  })],
  useFactory:async (configService:ConfigService): Promise<TypeOrmModuleOptions> => databaseConfiguration.getOrmConfig(configService),
  inject:[ConfigService]
}

.env

javascript
DB_PORT=3306
DB_NAME=your_db_name

.env.dev

DB_HOST=your_host
DB_USERNAME=your_username
DB_PASSWORD=your_password

14 Nestjs Config module to work with env files and hide your secrets from codebase