Node.js 在knex事务中引发自定义错误导致api崩溃
我目前正在与knex一起开发api。我必须在一个大事务中执行一些操作,并且必须在那里进行验证-如果任何验证返回“false”-则必须停止事务。问题是,每当我抛出“我的”错误时,即使所有的“Catch”es都得到了它,并且res被正确地发送了——就在那之后,我的整个api因错误而崩溃: 无法读取null的属性“removeListener” 这很奇怪,因为在捕捉由knex本身引起的错误方面没有类似的问题 扼杀,如果我要删除我的错误抛出-我仍然会得到未处理的异常 无法读取null的属性“回滚” 在代码中,它如下所示:Node.js 在knex事务中引发自定义错误导致api崩溃,node.js,transactions,knex.js,Node.js,Transactions,Knex.js,我目前正在与knex一起开发api。我必须在一个大事务中执行一些操作,并且必须在那里进行验证-如果任何验证返回“false”-则必须停止事务。问题是,每当我抛出“我的”错误时,即使所有的“Catch”es都得到了它,并且res被正确地发送了——就在那之后,我的整个api因错误而崩溃: 无法读取null的属性“removeListener” 这很奇怪,因为在捕捉由knex本身引起的错误方面没有类似的问题 扼杀,如果我要删除我的错误抛出-我仍然会得到未处理的异常 无法读取null的属性“回滚” 在代
f1(){
// (...)
let noErrors = true;
return global.knex
.transaction((trx) => {
return operation1(trx) //Knex operation returning object with parameter "correct"
.then((output)=>{
if(output.correct === false)
throw new Error('CustomError');
})
.then(()=>{ return operation2(trx); })
.then(()=>{ return operation3(trx); })
// (...)
.then(trx.commit)
.catch((error) => {
console.error('TRANS. FAILED');
noErrors = false;
trx.rollback();
throw error; // Both with and without it - failed
});
})
.then(() => {
console.log('TRANS. OK');
})
.then(() => {
if(noErrors)
return {result:'MyResultsHere'};
else
return {result:'ErrorOccured'};
})
.catch((error) => {
return {result:'ErrorOccuredAgain'};
});
}
然后返回此函数的结果(承诺):
f1().then((output)=>{
console.log(output.result);
// (...) sending response for request here
}
.catch((err) => {
console.error(err);
res.status(500).send();
});
经过一些额外的测试-看起来我可以抛出我的自定义错误,但这里的问题是回滚-而soemtiems我又得到一个错误:
TransactionError:只能在LoggedIn状态下发出请求,而不是
征兵国
看起来您混合了两种不同的事务处理语法(下面的简单示例): 及 您可能正在尝试这样做:
f1(){
// (...)
return global.knex
.transaction(trx => {
return operation1(trx)
.then(output => {
if(output.correct === false) {
// if wrong results promise will reject with "CustomError"
throw new Error('CustomError');
}
})
.then(() => operation2(trx))
.then(() => operation3(trx))
// (...)
;
})
.then(resultsOfLastThen => {
console.log('TRANS. OK', resultsOfLastOperation);
return { result: 'MyResultsHere' };
})
.catch(error => {
return { result: 'ErrorOccured' };
});
}
knex.transaction(trx => {
// NOT returning promise so you need to call commit / rollback explicitly
operation(1).then(results => trx.commit(results))
.catch(err => trx.rollback(err));
})
.then(results => console.log("stuff from transaction commit", results))
.catch(err => console.log("error passed to rollback", err))
f1(){
// (...)
return global.knex
.transaction(trx => {
return operation1(trx)
.then(output => {
if(output.correct === false) {
// if wrong results promise will reject with "CustomError"
throw new Error('CustomError');
}
})
.then(() => operation2(trx))
.then(() => operation3(trx))
// (...)
;
})
.then(resultsOfLastThen => {
console.log('TRANS. OK', resultsOfLastOperation);
return { result: 'MyResultsHere' };
})
.catch(error => {
return { result: 'ErrorOccured' };
});
}