无法捕获 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)
时,该链拒绝并泄漏该异常。
我正在按照这个问题中的建议使用 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)
时,该链拒绝并泄漏该异常。