首页 > 解决方案 > typeorm cli 不会等待从 ormconfig.ts 导出的异步方法

问题描述

Typeorm 应该能够像在文件中一样等待此导出。并且在这个问题中也有说明。由于某种原因,它不起作用。

// src/db/ormconfig.ts

import {
  Entity1, Entity2
} from '@entity/internal';
import { getSecret } from '@utils/SystemManager';
import Logger from '@utils/Logger';

const getConnectionOptions = async () => {
  const USERNAME = await getSecret('username');
  const PASSWORD = await getSecret('password');

  const {
    RDS_DB_INSTANCE_URL,
    RDS_DB_INSTANCE_PORT,
    RDS_DB_NAME,
  } = process.env;

  Logger.info(
    'Username: (%s) Password: (%s) InstanceURL: (%s) InstancePort: (%s) DBName: (%s)',
    USERNAME,
    PASSWORD,
    RDS_DB_INSTANCE_URL,
    RDS_DB_INSTANCE_PORT,
    RDS_DB_NAME,
  );

  const config = {
    name: 'default',
    type: 'postgres',
    port: Number(RDS_DB_INSTANCE_PORT),

    // this have to be false on production as it might drop the data
    synchronize: false,
    // migrationsRun: true,
    logging: true,
    host: RDS_DB_INSTANCE_URL,
    username: USERNAME,
    database: RDS_DB_NAME,
    password: PASSWORD,
    // TODO: set the naming strategy
    // namingStrategy: new SnakeNamingStrategy(),
    entities: [
      Entity1, Entity2,
    ],
    migrations: [`${__dirname}/migration/**/*.ts`],
    subscribers: [`${__dirname}subscriber/**/*.ts`],
    cli: {
      entitiesDir: 'src/entity',
      migrationsDir: 'src/migration',
      subscribersDir: 'src/subscriber',
    },
  };

  if (PASSWORD) {
    Object.assign(config, {
      password: PASSWORD,
    });
  }

  return config;
};

module.exports = getConnectionOptions;

我测试的命令是:

node --require ts-node/register --require tsconfig-paths/register ./node_modules/typeorm/cli.js --config ./src/db/ormconfig.ts

输出是:

Error during migration run:
TypeORMError: Cannot find connection default because its not defined in any orm configuration files.
    at new TypeORMError (C:\Users\ahmed\Desktop\manjaro\src\error\TypeORMError.ts:7:9)
    at ConnectionOptionsReader.<anonymous> (C:\Users\ahmed\Desktop\manjaro\src\connection\ConnectionOptionsReader.ts:56:19)
    at step (C:\Users\ahmed\Desktop\manjaro\node_modules\typeorm\node_modules\tslib\tslib.js:143:27)
    at Object.next (C:\Users\ahmed\Desktop\manjaro\node_modules\typeorm\node_modules\tslib\tslib.js:124:57)
    at fulfilled (C:\Users\ahmed\Desktop\manjaro\node_modules\typeorm\node_modules\tslib\tslib.js:114:62)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
error Command failed with exit code 1.

经过一些调试并直接在 node_modules 中编辑 typeorm 代码库后,我发现它使用的 connectionOptions 是“异步函数”类型,所以它没有等待它。有任何想法吗?

标签: javascriptnode.jstypescripttypeorm

解决方案


typeorm#4149中解决, 但引用如下:

// a.ts
const f = async () => {};
export f;

现在,

// b.ts
const f = await require('./a.ts');

这就是正在发生的事情,我正在导出方法本身并等待 require 假设它将调用该方法并等待它,但是事实并非如此。这会将“异步函数”传递给 typeorm。这将在以下情况下起作用:

// b.ts
const f = await require('./a.ts')();

但这需要在 typeorm 中工作 # 失败

但我们可以:

// a.ts
const f = async () => {};
export f();

调用 f,所以我们需要调用 f 而不是 f 本身,所以 await 可以处理它。


推荐阅读