typeorm createConnection 即使在带有 PG 的 MacOS 上使用 Await 也会返回 Pending

Posted

技术标签:

【中文标题】typeorm createConnection 即使在带有 PG 的 MacOS 上使用 Await 也会返回 Pending【英文标题】:typeorm createConnection return Pending even with Await on MacOS with PG 【发布时间】:2020-09-19 00:04:08 【问题描述】:

MacOS Catalina 10.15.4

如何重现,只需使用快速指南安装

npm install typeorm --save
npm install reflect-metadata --save
npm install @types/node --save
npm install pg --save
npm install typeorm -g
typeorm init --name MyProject --database postgres
cd MyProject
npm install
npm start

它会简单地返回

➜  MyProject npm start

> MyProject@0.0.1 start /Users/sergecolle/work/eve/MyProject
> ts-node src/index.ts

在进行故障排除时,我发现 then 和 catch 中的代码都没有被执行。修改代码后,类似于

const connection:Connection = await createConnection()

连接将处于 Pending 状态,然后程序简单地跳过 then 并捕获并终止。

我已经请朋友在他的 mac 上尝试一下,他也遇到了同样的问题。

typeorm 安装生成的 package.json 文件

   "name": "MyProject",
   "version": "0.0.1",
   "description": "Awesome project developed with TypeORM.",
   "devDependencies": 
      "ts-node": "3.3.0",
      "@types/node": "^8.0.29",
      "typescript": "3.3.3333"
   ,
   "dependencies": 
      "typeorm": "0.2.25",
      "reflect-metadata": "^0.1.10",
      "pg": "^7.3.0",
      "express": "^4.15.4",
      "body-parser": "^1.18.1"
   ,
   "scripts": 
      "start": "ts-node src/index.ts"
   

和 ormconfig.json


   "type": "postgres",
   "host": "localhost",
   "port": 5432,
   "username": "test",
   "password": "test",
   "database": "test",
   "synchronize": true,
   "logging": false,
   "entities": [
      "src/entity/**/*.ts"
   ],
   "migrations": [
      "src/migration/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ],
   "cli": 
      "entitiesDir": "src/entity",
      "migrationsDir": "src/migration",
      "subscribersDir": "src/subscriber"
   

并使用 psql 命令确保存在具有这些凭据的 postgres 数据库。

生成的 tsconfig.json


   "compilerOptions": 
      "lib": [
         "es5",
         "es6"
      ],
      "target": "es5",
      "module": "commonjs",
      "moduleResolution": "node",
      "outDir": "./build",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "sourceMap": true
   

lib 和 target 似乎有点旧,无法支持 async/await。我尝试将其更新为 es2017、es2018 和 esnext,但没有成功

【问题讨论】:

这似乎是 MacOS 的问题,虽然我们能够在 Mac 机器上重现,但上述步骤在 Linux 上运行良好。 【参考方案1】:

这似乎是 pg (node-postgres) 的问题。据我所知,您运行的是 7.3.0 版本。尝试使用 npm uninstall pg --save 卸载 pg,然后使用 npm install pg --save 再次安装。这将安装最新版本(对我来说是 8.2.1

附加信息:我有一个项目在 Ubuntu 上运行良好,然后在我的 MacBook 上设置它,在那里我遇到了同样的问题。我还尝试使用具有不同连接选项的 ConnectionManager,但它仍然无法正常工作。唯一有效的是我上面提到的解决方案

【讨论】:

我有同样的问题,升级pg版本后它开始工作了,谢谢 花了 2 天时间试图找到解决这个问题的方法,就这么简单!!!谢谢@badrain【参考方案2】:

在 mac mini 和 macbook pro 上遇到同样的问题,从官方网站获取 12.18.0 版本的 nodejs 解决了我的问题。

【讨论】:

以上是关于typeorm createConnection 即使在带有 PG 的 MacOS 上使用 Await 也会返回 Pending的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

使用 mongoose.createConnection() 与 mongoose.connect() 时查询挂起

typeorm的 join操作

TypeORM 不会在由 TypeORM 创建的项目中生成迁移

找不到模块'@nestjs/typeorm'

如何在 TypeOrm 中表示视图?