#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, поэтому ожидание работает над ним.