我正在 node.js 中编写服务器,并希望在连接失败并出现错误时保持运行。所以,我正在尝试使用新domain
模块,但找不到正确的使用方式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()
,要么它做了它不应该做的事情。我可能会深入研究源头,但与此同时,如果只是为了后代,澄清这个问题会很好。如果您知道应该如何使用该功能来保持应用程序的活力,请分享。谢谢。