2015-05-05 192 views
1

想象我有一个HTTP请求处理机内部以下代码:如何处理交易错误?

// these come from the HTTP request payload. 
var channel = {}; 
var screencast ={}; 

try { 
    connection.beginTransaction(function(err) { 
    if (err) { 
     throw err; 
    } 
    connection.query('INSERT INTO Channels SET ?', channel, function (err, result) { 
     if (err) { 
     connection.rollback(function() { 
      throw err; 
     }); 
     } 
     connection.query('INSERT INTO Screencasts SET ?', screencast, function (err, result) { 
     if (err) { 
      connection.rollback(function() { 
      throw err; 
      }); 
     } 
     connection.commit(function(err) { 
      if (err) { 
      connection.rollback(function() { 
       throw err; 
      }); 
      } 
      console.log('success!'); 
     }); 
     }); 
    }); 
    }); 
} catch (err) { 
    // render error page or something like that. 
    console.log(err) 
} 

当发生错误时,我期望要调用的catch块 - 这是并非如此。 为什么不呢?

我看不出抛出这么多的错误,如果我不能catch他们。有人可以解释吗?

此外,如果我不能依靠catch块,如何检测到发生错误,然后做某事

(我知道这么少这个代码,因为我适应的example

回答

0

花了一些时间了解承诺

var mysql = require('mysql'); 
var Promise = require('bluebird'); 
Promise.promisifyAll(require('mysql/lib/Connection').prototype); 

connection.beginTransactionAsync().then(function() { 
    return connection.queryAsync('INSERT INTO Channels SET ?', channel); 
}).then(function() { 
    return connection.queryAsync('INSERT INTO Screencasts1 SET ?', screencast); 
}).then(function() { 
    return connection.commit(); 
}).error(function(e) { 
    connection.rollback(); 
}); 
0

当您处理错误优先异步回调时,不会引发错误。错误被作为回调函数的第一个参数传递。所以处理那里的错误。 (在嵌套回调的情况下,这可能意味着简单地调用带有错误的父回调)。

基本上:您不能在这些回调中抛出错误,除非它们被捕获到与其引发的回调相同的内部。