2012-08-03 71 views
1

我正在寫在Node.js的服務器,並希望保持它運行時的連接失敗,出現錯誤。所以,我嘗試使用新的domain模塊,但無法找到使用domain.dispose()的正確途徑。的Node.js:使用domain.dispose()

首先,node -v:v0.8.3

我假設domain.dispose()應該叫上的錯誤,清理任何域對象已成立。但結果並不是我所期望的,我無法找到任何關於正確用法的文檔或討論。

這是我想出了隔離問題的代碼:

var domain = require('domain'); 
var EventEmitter = require('events').EventEmitter; 

var i = 0; 
function cycle() { 
    process.nextTick(cycle); 

    var emitter = new EventEmitter(); 
    emitter.i = ++i; 
    emitter.on('test', function() { 
     throw new Error('asdasd ' + emitter.i); 
    }); 

    var dm = domain.create(); 
    dm.on('error', function(er) { 
     console.error('Error', er); 
     //dm.dispose(); 
    }); 
    dm.add(emitter); 

    emitter.emit('test'); 
} 

cycle(); 

它創建了一個EventEmitter,爲它單獨的域,增加了發射到域,並觸發發射器的錯誤。然後它重複。

一切都很好,週期的推移,錯誤記錄了一個又一個:

[...] 
Error { [Error: asdasd 1068] 
    domain_thrown: true, 
    domain: { members: [ [Object] ], _events: { error: [Function] } } } 
Error { [Error: asdasd 1069] 
    domain_thrown: true, 
    domain: { members: [ [Object] ], _events: { error: [Function] } } } 
[...] 

現在,我想補充,我想這應該是domain.dispose()

dm.on('error', function(er) { 
    console.error('Error', er); 
    dm.dispose(); 
}); 

這樣,該週期只重複兩次:

Error { [Error: asdasd 1] 
    domain_thrown: true, 
    domain: { members: [ [Object] ], _events: { error: [Function] } } } 
Error { [Error: asdasd 2] 
    domain_thrown: true, 
    domain: { members: [ [Object] ], _events: { error: [Function] } } } 

沒有更多輸出,程序剛退出。

所以,要麼我不明白的domain.dispose()的目的和語義,或者它做什麼不應該做的。我可能會深入研究這個問題,但同時,如果僅僅爲了後代,澄清這個問題將會很好。如果您知道如何使用該功能來保持應用程序的正常運行,請分享。謝謝。

回答

3

正確使用v0.8.11節點將環與dm.dispose()