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();
});

このようにして、サイクルは 2 回だけ繰り返されます。

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 に答える