1

我正在 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(),要么它做了它不应该做的事情。我可能会深入研究源头,但与此同时,如果只是为了后代,澄清这个问题会很好。如果您知道应该如何使用该功能来保持应用程序的活力,请分享。谢谢。

4

1 回答 1

3

通过使用 v0.8.11 节点将正确循环使用dm.dispose().

于 2012-10-10T16:26:34.853 回答