How to create two database environments with NestJS and TypeORM?

Viewed 150

In a NestJS and TypeORM application, I want to create two database connections: development and test.

In TypeORM's document, it can define multiple blocks:

https://orkhan.gitbook.io/typeorm/docs/using-ormconfig#using-ormconfig.json

[{
   "name": "default",
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "test",
   "password": "test",
   "database": "test"
}, {
   "name": "second-connection",
   "type": "mysql",
   "host": "localhost",
   "port": 3306,
   "username": "test",
   "password": "test",
   "database": "test"
}]

In NestJS' document, it can get different env files to load into app:

https://docs.nestjs.com/techniques/configuration#custom-env-file-path

ConfigModule.forRoot({
  envFilePath: ['.env.development.local', '.env.development'],
});

In app's current connection file,

import { ConfigModule, ConfigService } from '@nestjs/config';
import config from '../config';

@Module({
  imports: [
    ConfigModule.forRoot({
      load: [config],
      isGlobal: true,
    }),
    TypeOrmModule.forRootAsync({
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        ...configService.get('db'),
        entities: Entities,
      }),
    }),
    ContactModule,
  ],
  providers: [],
})

config.ts

export default (): Record<string, any> => ({
  NODE_ENV: process.env.NODE_ENV,
  PORT: process.env.PORT || 3000,
  db: {
    type: 'mysql',
    name: 'default',
    host: process.env.DB_HOST,
    port: process.env.PORT || 3307,
    username: process.env.DB_USER,
    database: process.env.DB_NAME,
    schema: process.env.schema,
    synchronize: false,
    migrations: ['src/database/migration/**/*.ts'],
  },
});

ormconfig.ts

module.exports = [
  {
    type: 'mysql',
    name: 'default',
    host: process.env.DB_HOST,
    port: process.env.PORT || 3307,
    username: process.env.DB_USER,
    database: process.env.DB_NAME,
    schema: process.env.schema,
    synchronize: true,
  },
  {
    type: 'mysql',
    name: 'development',
    host: process.env.DB_HOST,
    port: process.env.PORT || 3307,
    username: process.env.DB_USER,
    database: process.env.DB_NAME,
    schema: process.env.schema,
    synchronize: false,
  },
  { // To Add
    type: 'mysql',
    name: 'test',
    host: process.env.DB_HOST,
    port: process.env.PORT || 3307,
    username: process.env.DB_USER,
    database: process.env.DB_NAME,
    schema: process.env.schema,
    synchronize: true,
  }

Which is the best way? Is it good to define different db connection infos in config.ts or add a test target into the ormconfig.ts to easy to set?

0 Answers
Related