无法捕获knex交易拒绝

时间:2019-07-14 23:33:42

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

我正在按照此问题中的建议使用具有异步/等待语法的knex事务:Get Knex.js transactions working with ES7 async/await

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

  

未处理的拒绝错误:关系“ some_table”不存在//我用于测试的示例错误

与记录器记录的错误相同,因此记录如下所示:

// 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()
  }
}

1 个答案:

答案 0 :(得分:0)

您使用的交易错误...请尝试以下操作:

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))

不将任何处理程序绑定到knex.transaction(trx => {...})调用返回的承诺链,然后在您调用.rollback(e)时,该链拒绝并泄漏该异常。