我正在按照此问题中的建议使用具有异步/等待语法的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()
}
}
答案 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)
时,该链拒绝并泄漏该异常。