【问题标题】:Knex.js won't connect to postgresKnex.js 不会连接到 postgres
【发布时间】:2021-02-01 04:39:02
【问题描述】:

我正在尝试使用 Knex.js 连接到 PostgreSQL 数据库,但我无法建立连接。我看到的唯一例外是:

错误 KnexTimeoutError: Knex: 获取连接超时。游泳池可能已经满了。您是否缺少 .transacting(trx) 调用?

我构建了这个简单的测试脚本以确保它不属于我们的程序:

const knex = require("knex")({
    client: 'pg',
    connection: {
        host : 'localhost',
        port: 5432,
        database: 'postgres',
        user: 'postgres',
        password: 'password'
    },
    pool: {
        afterCreate: (conn, done) => {
            console.log("Pool created");
            done(false, conn);
        }
    },
    debug: true,
    acquireConnectionTimeout: 2000
});

console.log("A")

const a = knex.raw('select 1+1 as result').then(result => console.log("A Success", result)).catch(err => console.log("A Error", err));

console.log("B")

const b = knex.select("thing").from("testdata").then(data => console.log("B Success", data)).catch(err => console.log("B Error", err));

console.log("C")

const c = knex.transaction(trx => {
    trx.select("thing").from("testdata")
        .then(data => {
            console.log("C Success", data);
        })
        .catch(err => {
            console.log("C Error", err);
        });
})
    .catch(err => {
        console.log("C Error", err);
    });

console.log("waiting on query")
// Promise.all([a, b, c]).then(() => {
//     console.log("Destroying")
//     knex.destroy()
// })

产生以下输出

A
B
C
waiting on query
A Error KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (E:\DEV\work\niba-backend\node_modules\knex\lib\client.js:347:26)
    at runNextTicks (internal/process/task_queues.js:58:5)
    at listOnTimeout (internal/timers.js:520:9)
    at processTimers (internal/timers.js:494:7) {
  sql: 'select 1+1 as result',
  bindings: undefined
}
B Error KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (E:\DEV\work\niba-backend\node_modules\knex\lib\client.js:347:26) {
  sql: undefined,
  bindings: undefined
}
C Error KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
    at Client_PG.acquireConnection (E:\DEV\work\niba-backend\node_modules\knex\lib\client.js:347:26)
    at async Transaction.acquireConnection (E:\DEV\work\niba-backend\node_modules\knex\lib\transaction.js:213:28)

它从不调用 afterCreate 方法。我已经使用适用于其他所有人的设置对我们的开发数据库进行了尝试,并在本地运行的 postgres 安装以及我能想到的每种设置组合进行了尝试。我什至把它传给了团队的另一位成员,它运行良好,所以我的机器里有东西,但我不知道是什么阻止了它。我在 postgres 日志中没有看到任何连接尝试,而且我似乎无法获得任何更好的错误消息来解决。

如果有人能提出我可以尝试的方法,或者从 Knex 获取更多信息的方法,我将不胜感激。

【问题讨论】:

  • 您可以尝试完全删除 afterCreate 并确保您的本地计算机 postgres 正在运行。同样在您的事务处理程序中,您应该从处理程序返回一个 Promise 以触发隐式提交/回滚。基本上,一切似乎都指向一个方向,即 postgres 已配置为不接受 TCP 连接。

标签: node.js postgresql knex.js


【解决方案1】:

我将问题追溯到我们使用的“pg”包的版本。正在使用 7.18,当我升级到最新版本(8.4)时,它开始连接。不知道为什么 7.x 版本不起作用。

【讨论】:

  • 非常感谢您发布此内容。 :) 我们的代码停止工作并更改了 pg 的版本。 :)
猜你喜欢
  • 1970-01-01
  • 2016-06-21
  • 2022-08-18
  • 2018-02-05
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多