Node.js 在knex事务中引发自定义错误导致api崩溃

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的属性“回滚” 在代

我目前正在与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' };
    });
}