1

外部サーバーに接続するいくつかのノード tcp クライアントと tls クライアントがあります。

    var socket = net.connect(args.connect.ip_port, args.connect.host);
    socket.setTimeout(this.timeout);
    socket.on('connect', this.socketOnConnect.bind(this));
    socket.on('error', this.socketOnError.bind(this));
    socket.on('timeout', this.socketOnTimeout.bind(this));

また

    this.clearStream = tls.connect(
        args.connect.ip_port,
        args.connect.url,
        {},
        this.onSecureConnect.bind(this)
    );
    this.clearStream.on('error', this.clearStreamOnError.bind(this));
    this.clearStream.on('end', this.clearStreamOnEnd.bind(this));

これらのサーバーは両方とも、未処理のエラーを断続的に発行します。

(err): events.js:72
 (err):         throw er; // Unhandled 'error' event
 (err):               ^
 (err): Error: read ECONNRESET
 (err):     at errnoException (net.js:904:11)
 (err):     at TCP.onread (net.js:558:19)
 (err): events.js:72
 (err):         throw er; // Unhandled 'error' event
 (err):               ^
 (err): Error: read ECONNRESET
 (err):     at errnoException (net.js:904:11)
 (err):     at TCP.onread (net.js:558:19)

on('error ハンドラーはこれらのエラーを処理する必要があると考えましたが、明らかにそうではありません。

ドメインを使用して接続呼び出しをラップできると思いますが、それを行う前に何が起こっているのかを理解したいと思います。

4

1 に答える 1

0

なぜエラーが on(' エラー ハンドラをこっそり通り過ぎているのかはわかりませんでしたが、先に進んでドメイン内の疑わしい関数をドメイン エラー ハンドラ内のトレースバックでラップしました。これにより、少なくとも問題は管理しやすくなりました。

興味のある方のために、以下のサンプル コードをご覧ください。

    var self = this;
    var domain1 = domain.create();

    domain1.on('error', function (err) {
        log.error(util.format('Domain error in tls client: %s.  Exiting.', err.message));
        log.error(traceback.replace(/(?:\r\n|\r|\n)/g, '<br />'));
        self.cleanExit();
    });

    domain1.run(function () {
        self.clearStream = tls.connect(
            args.connect.ip_port,
            args.connect.url,
            {},
            self.onSecureConnect.bind(self)
        );
    });
于 2015-05-28T11:46:26.217 に答える