2013-04-23 45 views
7

我刚开始在nodejs中使用域进行错误管理。Nodejs错误处理域和socket.io

有些东西我不能理解,当我用它们与socket.io。

这是我的示例代码:

io.sockets.on('connection', function cb1(socket){ 
    socket.on('event', function cb2(data){ 
    }); 
}); 

我开始把我所有的代码在“运行”方法

domain.run(function(){ 
    io.sockets.on('connection', function cb1(socket){ 
     socket.on('event', function cb2(data){ 
     }); 
    }); 
}); 

但是,如果错误在CB1和CB2发生它不处理!

然后我用绑定methon上车CB1

domain.run(function(){ 
    io.sockets.on('connection', domain.bind(function cb1(socket){ 
     socket.on('event', function cb2(data){ 
     }); 
    })); 
}); 

但是,如果错误在CB2发生它不处理!

我的问题是: 我必须在每个回调中放置一个“绑定”吗?在服务器和所需的文件?

当我开始研究域时,所有的教程都将它们定义为最好的解决方案来处理单点错误!

我错过了什么吗?

+0

没有答案有帮助吗? – 2015-03-28 12:49:09

回答

0

如果您在域的范围内创建套接字,那么引发错误的那个套接字对象中的所有事件都将被域捕获。

domain.run(function(){ 
    var io = require('socket.io').listen(80); 
    io.sockets.on('connection', function cb1(socket){ 
    socket.on('event', function cb2(data){ 
    }); 
    })); 
}); 

试试这个。

0

(我dorexx45,我忘记了密码)

我试过,但它的工作原理部分。

如果我在域内创建一个对象(例如mysql连接),那么该对象上的错误将不会被处理!

domain.run(function(){ 
    var pool = mysql.createPool(); 
    var io = require('socket.io').listen(80); 
    io.sockets.on('connection', function cb1(socket){ 
    socket.on('event', function cb2(data){ 
     pool.something(); 
    }); 
    })); 
}); 

如果在事情发生pool.something(),如不良的查询语法或错误连接的数据,误差不“逮住”的domain.run

+0

如果我只是把n显式抛出,它也会发生。 如果我在cb1中抛出一个错误,它将被缓存,如果我在cb2中抛出一个错误是不是! – dorexx45 2013-04-24 12:28:19

+1

你忘了密码@ dorexx45?那意味着你将无法将任何答案标记为正确答案?史诗大声笑:) – franzlorenzon 2013-09-06 09:48:05

0

编辑:是的,你必须绑定每一个回调。

看一下这个截屏,它解释了这个问题:Node Tuts Episode VIII - Handling Errors Using Domains(他从13:45开始讲这个)。

如果我已经正确理解了它,如果您不在回调中发出或抛出错误,则必须将它们与.bind.intercept明确绑定。但在我自己的回调经验中,这还不够,我必须将每个回调绑定到域。

0

我要做的就是为每一个插座一个新的领域:

var Domain = require('domain'); 

... 

io.sockets.on('connection', function (socket){ 

    d = domain.create(); 
    d.add(socket); 

    d.on('error', function() { 

     // You have access to the socket too in here, useful 
    }); 

    socket.on('event', function (data){ 

     socket.on('event2', function (data){ 

      throw new Error('I will be caught!'); 
     }); 
    }); 
}); 

为什么这项工作?

Domain.prototype.add会将现有的事件发射器添加到域中。意味着来自该发射器上事件的所有新回调将隐含地绑定到该域。