2013-04-23 127 views
7

我剛開始在nodejs中使用域進行錯誤管理。Nodejs錯誤處理域和socket.io

有些東西我不能理解,當我用它們與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發生它不處理!

然後我用綁定methon上車CB1

domain.run(function(){ 
    io.sockets.on('connection', domain.bind(function cb1(socket){ 
     socket.on('event', function cb2(data){ 
     }); 
    })); 
}); 

但是,如果錯誤在CB2發生它不處理!

我的問題是: 我必須在每個回調中放置一個「綁定」嗎?在服務器和所需的文件?

當我開始研究域時,所有的教程都將它們定義爲最好的解決方案來處理單點錯誤!

我錯過了什麼嗎?

+0

沒有答案有幫助嗎? – 2015-03-28 12:49:09

回答

0

如果您在域的範圍內創建套接字,那麼引發錯誤的那個套接字對象中的所有事件都將被域捕獲。

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

試試這個。

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

+0

如果我只是把n顯式拋出,它也會發生。 如果我在cb1中拋出一個錯誤,它將被緩存,如果我在cb2中拋出一個錯誤是不是! – dorexx45 2013-04-24 12:28:19

+1

你忘了密碼@ dorexx45?那意味着你將無法將任何答案標記爲正確答案?史詩大聲笑:) – franzlorenzon 2013-09-06 09:48:05

0

編輯:是的,你必須綁定每一個回調。

看一下這個截屏,它解釋了這個問題:Node Tuts Episode VIII - Handling Errors Using Domains(他從13:45開始講這個)。

如果我已經正確理解了它,如果您不在回調中發出或拋出錯誤,則必須將它們與.bind.intercept明確綁定。但在我自己的回調經驗中,這還不夠,我必須將每個回調綁定到域。

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會將現有的事件發射器添加到域中。意味着來自該發射器上事件的所有新回調將隱含地綁定到該域。