интерфейс командной строки typeorm не будет ожидать экспортированного асинхронного метода из ormconfig.ts

#javascript #node.js #typescript #typeorm

Вопрос:

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:UsersahmedDesktopmanjarosrcerrorTypeORMError.ts:7:9)
    at ConnectionOptionsReader.<anonymous> (C:UsersahmedDesktopmanjarosrcconnectionConnectionOptionsReader.ts:56:19)
    at step (C:UsersahmedDesktopmanjaronode_modulestypeormnode_modulestslibtslib.js:143:27)
    at Object.next (C:UsersahmedDesktopmanjaronode_modulestypeormnode_modulestslibtslib.js:124:57)
    at fulfilled (C:UsersahmedDesktopmanjaronode_modulestypeormnode_modulestslibtslib.js:114:62)
    at processTicksAndRejections (internal/process/task_queues.js:95:5)
error Command failed with exit code 1.
 

После некоторой отладки и прямого редактирования кодовой базы typeorm в модулях node_модуля я обнаружил, что используемые им функции подключения имеют тип «Асинхронная функция», поэтому он не ждал ее. Есть какие-нибудь идеи?

Ответ №1:

решена в типеорм#4149, но процитирована ниже:

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

А теперь,

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

Это было то, что происходит, я экспортировал сам метод и ожидал запроса, предполагая, что он вызовет метод и будет ждать его, однако это было не так. Это передаст «асинхронную функцию» в typeorm.
Это сработает, если:

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

но для этого требуется работа внутри typeorm # fail

но мы можем:

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

вызовите f, поэтому нам требуется вызов f, а не сам f, поэтому ожидание работает над ним.