处理来自EventEmitter的错误

时间:2012-11-29 01:10:13

标签: node.js

在继承EventEmitter的类中,我们通常有两个点来处理错误。

someClass.on('error', function eventEmitterCallback(err){/* handle error*/});
//and
someClass.someAsyncAction(function asyncActionCallback(err){/* handle error*/})

我们不知道哪里出现错误,以及将执行什么回调。 例如,tedious(MS SQL Server模块):

  • 密码不正确:两个回调
  • 数据库名称不正确:仅eventEmitterCallback; someAsyncAction执行无错误
  • 主机不正确:仅someAsyncAction
  • 主机IP的格式正确(例如1234.10.0.1):node.js刚刚关闭而没有任何错误:)

我想创建一个简单的函数,将所有错误从模块转移到回调的第一个参数。

function getSomeStuffFromDb(callback) { 
    var connection = new dbConnection(options);
    connection.on('error', callback);
    connection.connect(function(err) {
        if (err) return callback(err);
        /*exec SQL query*/
    }
}

当然,如果有任何错误原因,我只想执行一次回调。我怎么能这样做?如何将两个错误处理点合二为一?也许如果在我的班级中我使用继承EventEmmiter的类,我也需要从EventEmitter继承我的类。

1 个答案:

答案 0 :(得分:1)

如果要避免反复运行相同的事件处理程序,请使用once事件绑定。鉴于您的代码示例,我不相信onceon会有任何不同的行为,因为connection对象不是长寿的,但它更清楚地传达了意图。然后使用闭包范围标志来避免事件处理程序和回调响应相同的底层错误。

function getSomeStuffFromDb(callback) { 
    var handled = false;
    var connection = new dbConnection(options);
    connection.once('error', function (err) {
        if (err && !handled) {
            handled = true;
            return callback(err);
        }
    });
    connection.connect(function(err) {
        if (err) {
          if (handled) {
            return;
          } else {
            handled = true;
            return callback(err);
          }
        }
        /*exec SQL query*/
        callback();
    }
}