В настоящее время я работаю над api с knex. Я должен выполнить некоторые операции в одной крупной транзакции и должен также там валиться - если какая-либо проверка возвращает «false» - транзакция должна быть остановлена. Проблема заключается в том, когда я швыряю «моя» ошибка есть, даже если все «Поймать» эс получает его и УЭ отослано corrently- право после этого весь мой апи сбой с ошибкой:Выброс пользовательской ошибки в транзакции knex приводит к сбою api
Cannot read property "removeListener" of null
что странно, becouse там не являются похожими проблемами с ошибками лова, вызванными самим knex.
Strangley, если я бы удалить бросание моих ошибок - я все равно получите необработанное исключение
Cannot read property "rollback" of 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();
});
Через некоторого additiona ltesting - оказывается Лик я могу бросить свои собственные ошибки, но проблема здесь с откатом - и soemtiems я получить еще одну ошибки:
TransactionError: Requests can only be made in the LoggedIn state, not the SentClientRequest state