使用domains和socket.io进行Nodejs错误处理

时间:2013-04-23 16:36:02

标签: node.js socket.io dns node.js-domains

我刚刚开始在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中发生错误则不会处理它!

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

当我开始研究这些领域时,所有教程都将它们定义为在一个点上处理错误的最佳解决方案!

我错过了什么吗?

4 个答案:

答案 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会将现有的事件发射器添加到域中。意味着来自该发射器上的事件的所有新回调将隐式绑定到域。