我刚刚开始在nodejs中使用域来进行错误管理。
当我将它们与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中发生错误则不会处理它!
我的问题是: 我必须在每次回调中加一个“绑定”吗?在服务器和所需的文件中?
当我开始研究这些领域时,所有教程都将它们定义为在一个点上处理错误的最佳解决方案!
我错过了什么吗?
答案 0 :(得分:0)
如果您在域的范围内创建套接字,那么该套接字对象中抛出错误的所有事件都将被域捕获。
domain.run(function(){
var io = require('socket.io').listen(80);
io.sockets.on('connection', function cb1(socket){
socket.on('event', function cb2(data){
});
}));
});
试试这个。
答案 1 :(得分: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
“捕获”!
答案 2 :(得分:0)
编辑:是的,您必须绑定每个回调。
看看这个截屏视频,它解释了这个问题:Node Tuts Episode VIII - Handling Errors Using Domains(他从13:45开始讨论这个问题)。
如果我理解正确,如果你没有在回调中发出或抛出错误,你必须用.bind
或.intercept
明确地绑定它们。但根据我自己的回调经验,这还不够,我必须将每个回调绑定到域。
答案 3 :(得分: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
会将现有的事件发射器添加到域中。意味着来自该发射器上的事件的所有新回调将隐式绑定到域。