【问题标题】:Promise still pending even after knex.destroy()即使在 knex.destroy() 之后,承诺仍然悬而未决
【发布时间】:2020-07-02 17:36:00
【问题描述】:

我在学习 Promises 方面取得了一些进展,但我不明白为什么 knex 在节点中的行为如此。

我成功接收到一个查询和控制台。将其注销,但是当我运行时

节点文件名.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 来退出节点执行。

【问题讨论】:

    标签: node.js knex.js


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2019-04-13
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多