Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Knex:获取连接超时_Node.js_Postgresql_Knex.js_Postgresql 12 - Fatal编程技术网

Node.js Knex:获取连接超时

Node.js Knex:获取连接超时,node.js,postgresql,knex.js,postgresql-12,Node.js,Postgresql,Knex.js,Postgresql 12,从今天起,当我尝试使用knex.js本地连接到postgres数据库(v12)时,我遇到了以下错误 Unhandled rejection TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call? 这发生在一个我已经工作了一年的项目上,没有任何问题。为了解决这个问题,我创建了一个包含一个表的新数据库。当运行以下代

从今天起,当我尝试使用knex.js本地连接到postgres数据库(v12)时,我遇到了以下错误

Unhandled rejection TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
这发生在一个我已经工作了一年的项目上,没有任何问题。为了解决这个问题,我创建了一个包含一个表的新数据库。当运行以下代码行时,我得到了相同的错误:

const knex = require('knex');

const db = knex({
  client: 'pg',
  connection: 'postgresql://postgres:postgres@localhost/a_test',
  pool: {
    min: 0,
    max: 10,
  },
});

db.from('test_table')
  .select(['id'])
  .then(r => {
    console.log(r);
  });


我不知道这是什么原因。几周前,一切都很顺利,同时我没有做任何改变。我在本地运行postgres,当我使用
psql
连接到数据库时,一切正常。有什么办法可以解决这个问题吗?

原来问题出在节点v14上。当我使用v13或更早版本时,它可以工作。

看起来应该使用更新的(>8.0.3)pg驱动程序版本

问题 nodejsv14做了一些破坏性的更改,影响了
pg
模块!这使得它直接在
connect()调用时退出

你可以通过降级到v13来知道!(我称之为v14地狱)!这是过去的解决方案

pg的修复程序是在pg v8.0.3中编写的

修复v14 如果您使用的是
postgres
!使用nodejsv14及以上版本!确保在版本
>=8.0.3
时使用驱动模块
pg
!最好升级到最新版本

npm安装pg@latest--保存
如果您没有使用
postgres
!尝试更新数据库驱动程序!可能是一样的!还可以尝试使用nodejs
V13
。确认这是同一个问题!(V14地狱

v14中发生了什么 如果你像我一样想知道细节和发生了什么

使用节点V14!api上发生了一些突破性的更改!还有很多事情改变了!包括Openssl版本

为了博士后!和
pg
模块!问题如下所述:

初始readyState(一种私有/未记录的API,用于

net.Socket的pg使用)似乎已从“关闭”更改为“打开” 在节点14中

很难用完美的向后兼容性来修复,但我想我 有一个足够近的补丁

就这样

你可以看到这些变化

简言之,如上所述!onReady的api更改为
net.Socket
! 而实现的解决方案是根本不使用onReady

根据这个

连接现在总是在其流上调用connect时调用connect

在旧版本中,仅当套接字处于打开<代码>关闭状态时才调用connect<代码>readyState
使用已取消

检查

你可以理解

视具体情况而定!许多事情可能会或不会受到这些核心变化的影响

nodejsv14相关变更 因为我想看看变化发生在哪里!给你

您也可以查看更改日志:

详细说明为什么+退出且没有日志记录错误 还要提到突破性的变化!make
pg
connect()调用中退出进程。这就是它退出的原因!还有伐木!
更详细的信息!这是怎么发生的!续集有postgres方言实现!哪一个使用pg!还有pg客户端!创建一个连接!连接有一个
connect
事件!当它连接时,它会发射它!因为节点v14将流的行为更改为以open开头!跳过流连接!由于
readyState
检查(预期为关闭,但它变为打开!)!并且该流被视为已连接(否则阻塞)!不在的地方!并且直接发出
connect
事件!当那发生的时候!客户端将调用连接对象的
requestSsl()
startup()
方法!两者都将调用
this.\u stream.write
。因为流没有连接!一个错误发生了!此错误不可捕获!那么续集驱动中的承诺!不会解决的!然后事件循环变为空!Nodejs默认行为只是退出

您可以看到代码行中的步骤:

  • 其中一个方法get run和
    stream.write将被调用(,)
  • 流错误(未捕获)
  • 在sequelize postgres适配器中!还没有解决
  • 事件循环为空=>Nodejs=>Exit
为什么nodejs退出(未解决的承诺)


我刚刚使用
npm安装升级了我的
psql
pg@latest--save
,我的
knex
现在可以工作了。

事实上,这个错误可能是由很多问题引起的,今天我在上下滚动了无数类似这样的线程后,艰难地发现了一个新的错误

设置池时,knex允许我们选择性地注册
后创建
回调,如果添加了此回调,则必须调用作为注册回调的最后一个参数传递给您的
done
回调,否则将无法获得导致超时的连接

.....
    pool: {
      afterCreate: (conn, done) => {
        // .... add logic here ....
        // you must call with new connection
        done(null, conn);
      },
    }
.....

注意:非常简短的回答和/或回复到海报的问题可能应该是评论。你只需要50个代表点就可以在一个问题下发表评论-你能把这个移到那里吗?@Tyler2P我很乐意,我也试过这么做,但我需要50个代表点才能做到这一点!为什么有这么多感叹号!一个自我的表达!标记东西!新的写作风格!我珍视这些文字,并与之成为朋友!这是天生的!我也喜欢!我把精力放在这件事上了我又做了一次