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.run
“ domain.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将隐含地绑定到该域。