即使在 knex.destroy() 之后,Promise 仍然悬而未决

Promise still pending even after knex.destroy()

我在学习 Promises 方面取得了一些进展,但我不明白为什么 knex 在节点中表现得像这样。

我成功收到一个查询并console.log出来了,但是当我运行

node filename.js

进程在成功打印后不会退出并停留在那里,就像 Promise 仍在挂起一样。 .finally 语句中的 knex.destroy() 不应该结束 Promise 吗?

async function SELECT_ALL_P() {
  const transaction = await knex.transaction()
  return knex
  .select('*')
  .from('p')
  .then(items => {
    return console.log(items)
  })
  .catch(error => {
    console.log(error)
  })
  .finally(function() {
    knex.destroy()
  })
}

SELECT_ALL_P()

我试过

.then(items => {
    knex.destroy()
    return console.log(items)
  })

但它也没有用。我需要在终端中按 Ctrl+C 退出节点执行。

调用 knex.destroy() 时,knex 将不允许启动新的 queries/transactions,然后等待所有这些都完成,然后关闭所有内容并销毁池。

在您的示例中,您从不执行 transaction.commit()transaction.rollback(err),因此连接永远不会返回到池中并且调用 knex.destroy() 永远不会完成(也许它会在超时后完成) .

实际上,您甚至从未通过该交易进行任何查询。如果您只想创建一个选项以在需要时进行交易,您可以创建 transactionProvider,然后在第一次请求时懒惰地创建一个单例交易。