无法捕获 knex 交易拒绝

Unable to catch knex transaction rejection

我正在按照这个问题中的建议使用 async/await 语法的 knex 事务:

我的问题是,当交易失败并调用 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 (, , ) 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))

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