javascript - 无法捕获 knex 交易拒绝

标签 javascript node.js error-handling knex.js koa

我正在使用带有异步/等待语法的 knex 事务,如以下问题所示:Get Knex.js transactions working with ES7 async/await

我的问题是,当事务失败并调用 trx 回调时,knex 日志

Unhandled rejection error: relation "some_table" doesn't exist // Example error which I used for testing



就在记录器记录的相同错误下,所以日志看起来像这样:
// Removed error stacks...

// Error logged by logger
2019-07-14T23:12:29.606Z [error]: error: insert into "tab1" ("col1", "col2", "col3") values ($1, $2, $3) returning "col3" - relation "tab1" does not exist

// Koa.js error from ctx.throw()
InternalServerError: Internal Server Error

// Error when invoking await trx.rollback(e)
Unhandled rejection error: relation "tab1" does not exist

我想要实现的是调用 trx.rollback(e) 而不抛出未处理的拒绝错误。

导致此问题的代码:
async function create (ctx) {
  const trx = await tools.promisify(knex.transaction.bind(knex))
  try {
    let [var1] = await trx('tab1').insert({...}).returning(['x', 'y'])

    // tab2 doesn't exist to trigger an error
    const [var2] = await trx('tab2').insert({...}).returning('z')

    await trx.commit()
  } catch (e) {
    await trx.rollback(e)
    logger.error(e)
    ctx.throw()
  }
}

最佳答案

您使用错误的交易...试试这个:

async function create (ctx) {
  try {
    const res = await knex.transaction(async trx => {
      let [var1] = await trx('tab1').insert({...}).returning(['x', 'y'])
      // tab2 doesn't exist to trigger an error
      const [var2] = await trx('tab2').insert({...}).returning('z')

      return [var1, var2];
    });
  } catch (e) {
    logger.error(e)
    ctx.throw()
  }
}

此外,如果你真的想要,你可以使用最新的 knex 0.18 和 transactionProvider() ...它是从 knex 文档中找到的...但是在您的情况下,第一种方式效果更好,并且比显式提交更加健壮。

你的问题的真正答案是这条线:
trx = await tools.promisify(knex.transaction.bind(knex))

不将任何处理程序绑定(bind)到 knex.transaction(trx => {...}) 返回的 promise 链打电话,然后当你打电话时.rollback(e)该链拒绝并泄漏该异常。

关于javascript - 无法捕获 knex 交易拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57031914/

相关文章:

javascript - 如何在 mp4 文件缓冲时使用 flowplayer 播放?

javascript - 如何在将 json 文件的元素与另一个 json 文件进行比较后更改该文件的值?

javascript - 如何删除传单中的标记分组?

javascript - JQuery:如何叠加许多异步启动的移动动画?

javascript - 构建多维数组

javascript - 在 V8 中从 C++ 代码创建自定义错误类

ruby - 用消息拯救异常

c# - 在Dispose()中处理异常

javascript - 通过shell脚本在特定端口启动jsreport服务

Node.js 使用 HTTP GET 实现 open.epic 单点登录?