Node.js Nodejs对域和socket.io的错误处理
我刚刚开始在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
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:)这些答案都没有帮助吗?