Node.js Nodejs对域和socket.io的错误处理

Node.js Nodejs对域和socket.io的错误处理,node.js,socket.io,dns,node.js-domains,Node.js,Socket.io,Dns,Node.js Domains,我刚刚开始在nodejs中使用域进行错误管理 当我将它们与socket.io一起使用时,有些东西我无法理解 这是我的示例代码: io.sockets.on('connection', function cb1(socket){ socket.on('event', function cb2(data){ }); }); 我开始将所有代码放在“run”方法中 但如果cb1或cb2中发生错误,则不会处理 domain.run(function(){ var pool = mys

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

当我将它们与socket.io一起使用时,有些东西我无法理解

这是我的示例代码:

io.sockets.on('connection', function cb1(socket){
    socket.on('event', function cb2(data){
    });
});
我开始将所有代码放在“run”方法中

但如果cb1或cb2中发生错误,则不会处理

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();
   });
  }));
});
然后我在che cb1上使用了bind方法

domain.run(function(){
    io.sockets.on('connection', domain.bind(function cb1(socket){
        socket.on('event', function cb2(data){
        });
    }));
});
但如果cb2中发生错误,则不会处理

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();
   });
  }));
});
我的问题是: 我是否必须在每个回调上设置一个“绑定”?在服务器和所需文件中

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


我遗漏了什么吗?

如果您在域的范围内创建套接字,那么域将捕获该套接字对象中抛出错误的所有事件

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

(我是Dorex45,我忘了密码)

我试过了,但部分有效

如果我在域内创建一个对象(es.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();
   });
  }));
});

如果
池.something()

编辑:是的,您必须绑定每个回调

看看这个视频,它解释了这个问题:(他从13:45开始谈论这个问题)


如果我理解正确,如果没有在回调中发出或抛出错误,则必须显式地将它们与或绑定。但根据我自己在回调方面的经验,这还不够,我必须将每个回调绑定到域。

我要做的是为每个套接字创建一个新域:

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

如果我只放入n个显式抛出,情况也会相同。如果我在cb1中抛出错误,它将被缓存;如果我在cb2中抛出错误,它将不会被缓存!您忘记了密码@dorex45?这意味着你将无法将任何答案标记为正确答案?史诗lol:)这些答案都没有帮助吗?