javascript - 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 是“异步函数”类型,所以它没有等待它。有任何想法吗?
解决方案
在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 可以处理它。
推荐阅读
- node.js - How to sort two different models unrelated models in mongoose as one array?
- database - 从 DLookup Multiple Criteria VBA 中查找和替换表中的值
- php - Wordpress get public user data
- browser - VSC will not open any browser
- mysql - How do I delete a row with trigger when a cells has a value of 0
- excel - Excel: How to move data across from one column to another column
- haskell - Haskell Error: Cannot justify constraints in explicitly typed binding
- react-native - 使用 npx 命令运行 react-native 项目
- python - %04 和 %02 在 Python 中究竟做了什么?
- javascript - vue-awesome-swiper 中的自定义转换