我正在寫在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()
的目的和語義,或者它做什麼不應該做的。我可能會深入研究這個問題,但同時,如果僅僅爲了後代,澄清這個問題將會很好。如果您知道如何使用該功能來保持應用程序的正常運行,請分享。謝謝。