typescript 如何使用TypeOrmModule.forRootAsync作为数据源生成迁移?

lndjwyie  于 2023-04-13  发布在  TypeScript
关注(0)|答案(1)|浏览(277)

尝试在nest.js项目中集成迁移,我从typeorm运行了migration:create命令,没有问题,但当我尝试使用migration:generate生成迁移时,如下所示:yarn run typeorm migration:generate ./src/migrations -d ./src/database/database.provider.ts是./src/migrations文件夹,我希望迁移到./src/database/database.provider.ts文件夹中,我有我的数据源,稍后我会向您展示,关键是我得到了以下错误:”

Error: Given data source file must contain export of a DataSource instance
    at Function.loadDataSource (C:\Proyectos\AmazingDigisignBackend\documents-service-nest\node_modules\src\commands\CommandUtils.ts:49:19)
    at async Object.handler (C:\Proyectos\AmazingDigisignBackend\documents-service-nest\node_modules\src\commands\MigrationGenerateCommand.ts:73:26)
Done in 3.74s.

这是database.provider.ts:

import {DynamicModule} from "@nestjs/common";
import {ConfigService} from "@nestjs/config";
import {TypeOrmModule} from "@nestjs/typeorm";
import {DataSourceOptions} from "typeorm";

export const DatabaseProvider: DynamicModule = TypeOrmModule.forRootAsync({
  inject: [ConfigService],
  async useFactory(config: ConfigService) {
    return {
      type: 'postgres',
      host: config.get('DATABASE_HOST'),
      username: config.get('DATABASE_USERNAME'),
      password: config.get('DATABASE_PASSWORD'),
      port: config.get('DATABASE_PORT'),
      database: config.get('DATABASE_NAME'),
      autoLoadEntities: true,
      synchronize: false,
      migrations: [__dirname + '/../src/migrations/*{.ts,.js}'],
    } as DataSourceOptions;
  }
})

这是我的数据库模块:

import {Module} from '@nestjs/common';
import {DatabaseProvider} from './database.provider';

@Module({
  imports: [DatabaseProvider],
  exports: [DatabaseProvider]
})
export class DatabaseModule {
};

我尝试使用旧的typeorm命令,如:yarn run typeorm migration:generate -n newMigration.我已经检查了一百次文档,他们没有告诉你如何使用typeormmoduleconfig作为数据源生成迁移,我想创建一个ormconfig.json,但我不喜欢它,如果没有其他工作,我想我没有太多的选择。

rta7y2nd

rta7y2nd1#

您提供给yarn run typeorm migration:generate命令的文件database.provider.ts导出的是NestJS动态模块,而不是TypeORM CLI可以使用的DataSource。
但是,您可以添加一个在database.provider.ts中构建DataSource选项的函数,然后在一个单独的文件中重用该函数来构建CLI所需的配置。
在您的database.provider.ts中:

import {DynamicModule} from "@nestjs/common";
import {ConfigService} from "@nestjs/config";
import {TypeOrmModule} from "@nestjs/typeorm";
import {DataSourceOptions} from "typeorm";

export const DatabaseProvider: DynamicModule = TypeOrmModule.forRootAsync({
  inject: [ConfigService],
  useFactory: buildDataSourceOptions
})

export function buildDataSourceOptions(configService: ConfigService): DataSourceOptions {
    return {
      type: 'postgres',
      host: config.get('DATABASE_HOST'),
      username: config.get('DATABASE_USERNAME'),
      password: config.get('DATABASE_PASSWORD'),
      port: config.get('DATABASE_PORT'),
      database: config.get('DATABASE_NAME'),
      autoLoadEntities: true,
      synchronize: false,
      migrations: [__dirname + '/../src/migrations/*{.ts,.js}'],
    };
}

和TypeORM cli的配置文件,在单独的文件中(例如database.config.ts

import { ConfigModule, ConfigService } from '@nestjs/config';
import { DataSource } from 'typeorm';
import { buildDataSourceOptions } from './database.provider';

// This will load environment values.
ConfigModule.forRoot(/* Pass here the same options that you would pass when
calling this method from your root module */);

// This will be used by the cli
export default new DataSource(buildDataSourceOptions(new ConfigService()));

因此,您可以这样调用CLI:
yarn run typeorm migration:generate ./src/migrations -d ./src/database/database.config.ts
此外,TypeORM CLI不支持选项autoLoadEntities

相关问题