nestjs typeorm cli Использовать общую конфигурацию (конфиг). Пример кода

Основная идея -- для nest использовать передаваемый как параметр configService, а для режима cli командной строки самостоятельно парсить env (и вообще в любом случае самостоятельно если сервис конфигурации не переда как аргумент). Пример реализации ниже

Пример конфига config.ts (в нашем случае лежал относительно корня проекта так: src/modules/database/config.ts ):


import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
import { config as dotenvConfig } from 'dotenv';
import * as path from 'path';

const dotenvValues = dotenvConfig().parsed;

function getFromConfigServiceOrEnvDirectly(
  optionName: string,
  configService: ConfigService | null = null,
) {
  return configService
    ? configService.get(optionName)
    : dotenvValues[optionName];
}

export function getTypeORMConfig(
  configService: ConfigService | null = null,
): TypeOrmModuleOptions {
  console.log(
    'entity pattern',
    path.join(__dirname, '/entities') + '/**/*entity{.ts,.js}',
  );

  const config: TypeOrmModuleOptions = {
    type: 'postgres',
    // name: 'main',
    host: getFromConfigServiceOrEnvDirectly('POSTGRES_HOST', configService),
    port: getFromConfigServiceOrEnvDirectly('POSTGRES_PORT', configService),
    username: getFromConfigServiceOrEnvDirectly('POSTGRES_USER', configService),
    password: getFromConfigServiceOrEnvDirectly(
      'POSTGRES_PASSWORD',
      configService,
    ),
    database: getFromConfigServiceOrEnvDirectly('POSTGRES_DB', configService),
    entities: [
      path.join(__dirname, '/../../entities') + '/**/*entity{.ts,.js}',
    ],
    synchronize: false,
    migrationsTableName: 'migrations_table',
    migrations: [path.join(__dirname, '/../../migrations') + '/*.ts'],
    cli: {
      migrationsDir: path.join(__dirname, '/../../migrations'),
    },
    logging: process.env.NODE_ENV === 'production' ? false : 'all',
  };

  console.log('my config', config);

  return config;
}

export default getTypeORMConfig(); // for cli command line

--где экспорт

export default getTypeORMConfig();

как раз используется ради консольно команды миграций

в этой конфигурации папки миграций и сущностей располагались так:

src/migrations
src/entities/ 

Конфигурация NestJs с этим конфигом

Сконфигурируем модуль с конфигом описанным выше:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { getTypeORMConfig } from 'src/modules/database/config';

@Module({
  imports: [
    TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: (configService: ConfigService) =>
        getTypeORMConfig(configService),
    }),
  ],
})
export class DatabaseModule {}

Консольные команды, использующие тот же конфиг

Консольные команды для кофигурации выше (package.json scripts) могут быть такими:

    "typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js --config src/modules/database/config.ts",
    "migration:create": "npm run typeorm migration:create -- -n",
    "migration:run": "npm run typeorm migration:run",
    "migration:run:debug": "npm run typeorm:debug migration:run",
    "migration:revert": "npm run typeorm  migration:revert",
    "migration:generate": "npm run typeorm migration:generate -- -n",
    "migration:generate:debug": "npm run typeorm:debug migration:generate -- -n",
    "schema:log": "npm run typeorm  schema:log"