1. ホーム
  2. node.js

[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?

2022-02-01 19:24:37

質問

Socket.ioを使用したExpress.jsアプリケーションをチャットウェブアプリケーションとして実行しています。 というエラーが24時間以内に5回ほどランダムに発生します。 nodeプロセスは永遠にラップされ、すぐに自分自身を再起動します。

問題は、Expressを再起動すると、ユーザーが自分の部屋から追い出されることです。 誰もそれを望んでいません。

WebサーバーはHAProxyでプロキシしています。ソケットの安定性に問題はありません。 ウェブソケットとフラッシュソケットトランスポートを使用するだけです。 意図的に再現することができません。

これは、Nodeでのエラーです v0.10.11 :

    events.js:72
            throw er; // Unhandled 'error' event
                  ^
    Error: read ECONNRESET     //alternatively it s a 'write'
        at errnoException (net.js:900:11)
        at TCP.onread (net.js:555:19)
    error: Forever detected script exited with code: 8
    error: Forever restarting script for 2 time

編集 (2013-07-22)

socket.ioのクライアントエラーハンドラとキャッチされない例外ハンドラの両方を追加した。 こちらがエラーを捕捉するようだ。

    process.on('uncaughtException', function (err) {
      console.error(err.stack);
      console.log("Node NOT Exiting...");
    });

Socket.ioの問題ではなく、他のサーバーへのHTTPリクエストが原因だと思われます。 またはMySQL/Redis接続を行うことです。問題は、エラースタック は、私のコードの問題を特定するのに役立ちません。以下はログ出力です。

    Error: read ECONNRESET
        at errnoException (net.js:900:11)
        at TCP.onread (net.js:555:19)

この原因を知るにはどうしたらいいですか?どうすればこのエラーからもっと多くの情報を得られるのでしょうか?

OK、あまり饒舌ではありませんが、これがLongjohnのスタックトレースです。

    Exception caught: Error ECONNRESET
    { [Error: read ECONNRESET]
      code: 'ECONNRESET',
      errno: 'ECONNRESET',
      syscall: 'read',
      __cached_trace__:
       [ { receiver: [Object],
           fun: [Function: errnoException],
           pos: 22930 },
         { receiver: [Object], fun: [Function: onread], pos: 14545 },
         {},
         { receiver: [Object],
           fun: [Function: fireErrorCallbacks],
           pos: 11672 },
         { receiver: [Object], fun: [Function], pos: 12329 },
         { receiver: [Object], fun: [Function: onread], pos: 14536 } ],
      __previous__:
       { [Error]
         id: 1061835,
         location: 'fireErrorCallbacks (net.js:439)',
         __location__: 'process.nextTick',
         __previous__: null,
         __trace_count__: 1,
         __cached_trace__: [ [Object], [Object], [Object] ] } }

ここでは、フラッシュソケットポリシーファイルを提供しています。

    net = require("net")
    net.createServer( (socket) =>
      socket.write("<?xml version=\"1.0\"?>\n")
      socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
      socket.write("<cross-domain-policy>\n")
      socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
      socket.write("</cross-domain-policy>\n")
      socket.end()
    ).listen(843)

これが原因なのでしょうか?

解決方法は?

フラッシュポリシーファイルを提供するために持っていた単純なtcpサーバーがこれを引き起こしていました。ハンドラを使ってエラーをキャッチすることができるようになりました。

# serving the flash policy file
net = require("net")

net.createServer((socket) =>
  //just added
  socket.on("error", (err) =>
    console.log("Caught flash policy server socket error: ")
    console.log(err.stack)
  )

  socket.write("<?xml version=\"1.0\"?>\n")
  socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
  socket.write("<cross-domain-policy>\n")
  socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
  socket.write("</cross-domain-policy>\n")
  socket.end()
).listen(843)