web-dev-qa-db-ja.com

NodeJSでソケットハングアップエラーをデバッグする方法は?

次のエラーが表示されます。

events.js:48
        throw arguments[1]; // Unhandled 'error' event
        ^
Error: socket hang up
    at createHangUpError (http.js:1091:15)
    at Socket.onend (http.js:1154:27)
    at TCP.onread (net.js:363:26)

ノードv0.6.6では、コードに複数のhttp.requestおよび.get呼び出しがあります。ソケットのハングアップの原因と、それがどのリクエスト/コールであるかを追跡する方法を提案してください。ありがとうございました

48
user971956

開発のための迅速で汚れたソリューション

longjohn を使用すると、非同期操作を含む長いスタックトレースが取得されます。

クリーンで正しいソリューション:技術的には、ノードで、 'error'イベントを発行し、誰もそれをリッスンしない場合)スローされます 。スローしないようにするには、リスナーを配置して自分で処理します。そうすれば、より多くの情報でエラーを記録できます。

呼び出しグループに1つのリスナーを設定するには、 domains を使用し、実行時に他のエラーをキャッチすることもできます。 http(Server/Client)に関連する各非同期操作が、コードの他の部分と比較して異なる domain コンテキストにあることを確認してください。ドメインはerrorイベントを自動的にリッスンし、それを独自のハンドラーに伝搬します。そのため、そのハンドラーをリッスンし、エラーデータを取得するだけです。 無料で詳細情報も入手できます。(ドメインは非推奨です)。

Mikeが示唆したように、NODE_DEBUG=netを設定するか、 strace を使用することもできます。どちらも、ノードが内部的に実行していることを提供します。

39

さらに、NODE_DEBUG環境変数をnetに追加して、すべてのソケットが実行していることに関する情報を取得します。これにより、どのリモートリソースが接続をリセットしているかを分離できます。

14
Mike

Ftft1885の答えに加えて

http.get(url, function(res)
{
    var bodyChunks = [];

    res.on('data', function(chunk)
    {
        // Store data chunks in an array
        bodyChunks.Push(chunk);
    }).on('error', function(e)
    {
        // Call callback function with the error object which comes from the response
        callback(e, null);
    }).on('end', function()
    {
        // Call callback function with the concatenated chunks parsed as a JSON object (for example)
        callback(null, JSON.parse(Buffer.concat(bodyChunks)));
    });
}).on('error', function(e) {
    // Call callback function with the error object which comes from the request
    callback(e, null);
});

この「ソケットのハングアップ」エラーが発生したのは、リクエストのエラーをキャッチしていなかったためです。

10
fwoelffel

つかいます

req.on('error',function(err){})
4
ftft1885

ほとんどの場合、すべてのhttp.ServerResponseオブジェクトが終了する前に、サーバーソケット接続が何らかの形で閉じられました。着信接続で何かを行う前に、着信要求をすべて停止していることを確認してください(着信接続は着信HTTP要求とは別のものです)。

0