使用“useFactory”运行迁移

juz*_*ode 2 nest typeorm

我的应用程序nestjs包含app.module.ts以下配置:

import { ConfigModule, ConfigService } from '@nestjs/config';
import {
  TypeOrmModuleAsyncOptions,
  TypeOrmModuleOptions,
} from '@nestjs/typeorm';
import { DataSource } from 'typeorm';  

export const typeOrmAsyncConfig: TypeOrmModuleAsyncOptions = {
  imports: [ConfigModule],
  inject: [ConfigService],
  name: 'nameA',
  useFactory: (configService: ConfigService) => ({
    type: 'postgres',
    host: configService.get('DB_HOST'),
    port: parseInt(configService.get('DB_PORT') || '5432'),
    username: configService.get('DB_USER'),
    password: configService.get('DB_PASSWORD'),
    database: configService.get('DB_NAME'),
    entities: [__dirname + './../**/*.entity{.ts,.js}'],
    migrations: [__dirname + '/../database/migrations/*{.ts,.js}'],
    synchronize: false,
    cli: {
      entitiesDir: __dirname + './../**/*.entity{.ts,.js}',
    },
    ssl: configService.get('DB_SSL') === 'true',
  }),
};

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    TypeOrmModule.forRootAsync(typeOrmAsyncConfig),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

我已typeorm全局安装并在上面的指定路径中生成了迁移文件,但是,我收到dataSource未找到错误。

typeorm migration:run输出:

Runs all pending migrations.

Options:
  -h, --help         Show help                                         [boolean]
  -d, --dataSource   Path to the file where your DataSource instance is defined.
                                                                      [required]
  -t, --transaction  Indicates if transaction should be used or not for
                     migration run. Enabled by default.     [default: "default"]
  -v, --version      Show version number                               [boolean]

Missing required argument: dataSource
Run Code Online (Sandbox Code Playgroud)

当我使用内部时如何导出数据源useFactoryapp.module.ts解决这个问题?

lin*_*usw 6

由于 typeorm 0.3.x cli 需要数据源,并且不再支持 ormconfig.json。cli 命令也发生了变化。您可以为 Nestjs 和 typeorm-cli 定义单独的配置。

src/config/database-config.ts

    import 'dotenv/config';
    import { DataSourceOptions } from 'typeorm';
    
    const databaseConfig: DataSourceOptions = {
      name: 'default',
      type: 'better-sqlite3',
      database: process.env.DB_NAME,
      entities: [__dirname + '/../entities/*.entity.ts'],
      migrations: [__dirname + '/../migrations/*{.ts,.js}'],
      synchronize: false,
      logging: true,
      migrationsRun: true
    };
    
    export default databaseConfig;
Run Code Online (Sandbox Code Playgroud)

然后对于 typeorm cli

src/config/data-source.ts

    import { DataSource } from 'typeorm';
    import databaseConfig from './database-config';
    
    export const AppDataSource = new DataSource(databaseConfig);
Run Code Online (Sandbox Code Playgroud)

对于nestjs应用程序模块

src/config/typeorm-config.ts like so: TypeOrmModule.forRootAsync(typeOrmAsyncConfig)

    import { ConfigModule, ConfigService } from '@nestjs/config';
    import {
      TypeOrmModuleAsyncOptions,
      TypeOrmModuleOptions,
    } from '@nestjs/typeorm';
    import databaseConfig from './database-config';
    
    export const typeOrmConfig: TypeOrmModuleOptions = databaseConfig;
    
    export const typeOrmAsyncConfig: TypeOrmModuleAsyncOptions = {
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (): Promise<TypeOrmModuleOptions> => {
        return databaseConfig;
      },
    };
Run Code Online (Sandbox Code Playgroud)

package.json 脚本(如果需要,更改yarn run)

    {
    "typeorm:cli": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d src/config/data-source.ts",
    "migration:generate": "yarn run typeorm:cli migration:generate",
    "migration:create": "yarn run typeorm:cli migration:create",
    "migration:run": "yarn run typeorm:cli migration:run",
    "migration:revert": "yarn run typeorm:cli migration:revert"
    }
Run Code Online (Sandbox Code Playgroud)

例如,如果您需要生成终端中所需的新迁移完整路径

yarn run migration:generate src/migrations/newMigrationName
Run Code Online (Sandbox Code Playgroud)