2017-01-23 16 views
1

В настоящее время я работаю над 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

ответ

1

Похоже, вы смешиваете 2 различных обработки транзакций синтаксиса (простые примеры ниже):

knex.transaction(trx => { 
    // returning promise automatically calls commit/rollback 
    return operation(1); 
}) 
.then(results => console.log("commit was called automatically", results)) 
.catch(err => console.log("rollback was called automatically", err)) 

и

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' }; 
    }); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^