Nodejserror handling与域和socket.io

我刚刚开始在nodejs中使用域进行错误pipe理。

有什么我不能理解,当我用它们与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中发生错误,则不会被处理!

然后我用che cb1上的绑定方法

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

但是,如果在cb2中发生错误,则不予处理!

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

当我开始研究这些领域时,所有的教程都将它们定义为最好的解决scheme来处理您的错误!

我错过了什么吗?

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

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

尝试这个。

(我是dorexx45,我忘了密码)

我尝试过,但部分工作。

如果我在域内创build一个对象(例如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.rundomain.run

编辑 :是的,你必须绑定每个callback。

看看这个截屏,它解释了这个问题: Node Tuts Episode VIII – 使用域处理错误 (他从13:45开始讨论这个问题)。

如果我正确地理解了它,如果不在callback中发出或抛出错误,则必须使用.bind.intercept显式绑定它们。 但根据我自己的callback经验,这是不够的,我必须将每个callback绑定到域。

我所做的是为每个套接字创build一个新的域:

 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会将现有的事件发射器添加到域中。 意味着来自该发射器事件的所有新的callback将隐含地绑定到该域。