wake-up-neo.net

Wie debuggen Sie einen Socket-Hangup-Fehler in NodeJS?

Ich erhalte folgende Fehlermeldung:

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)

In Knoten v0.6.6 enthält mein Code mehrere http.request- und .get-Aufrufe Bitte schlagen Sie Wege vor, um zu ermitteln, warum der Socket aufhängt und auf welcher Anforderung/welchem ​​Aufruf er sich befindet . Vielen Dank

44
user971956

Schnelle und schmutzige Lösung für die Entwicklung:

Verwenden Sie longjohn , um lange Stapelspuren zu erhalten, die die asynchronen Operationen enthalten.

Saubere und korrekte Lösung: Technisch gesehen, in Knoten, wenn Sie ein 'error'-Ereignis ausgeben und niemand darauf hört, wird ausgegeben. Damit es nicht geworfen wird, legen Sie einen Hörer darauf und handhaben Sie es selbst. Auf diese Weise können Sie den Fehler mit weiteren Informationen protokollieren.

Um einen Listener für eine Anrufgruppe zu haben, können Sie domains verwenden und andere Fehler während der Laufzeit abfangen. Stellen Sie sicher, dass sich jeder async-Vorgang, der sich auf http (Server/Client) bezieht, im Vergleich zu den anderen Teilen des Codes in einem anderen domain - Kontext befindet. Die Domäne überwacht automatisch die error -Ereignisse und übermittelt sie an ihren eigenen Handler. Sie hören also nur diesen Handler und erhalten die Fehlerdaten. Sie erhalten auch kostenlos weitere Informationen.(Domains sind veraltet). 

Als Mike können Sie auch NODE_DEBUG=net einstellen oder strace verwenden. Beide bieten Ihnen an, was der Knoten intern tut. 

37

Außerdem können Sie die Umgebungsvariable NODE_DEBUG auf net setzen, um Informationen über die Aktivitäten aller Sockets zu erhalten. Auf diese Weise können Sie isolieren, welche Remote-Ressource die Verbindung zurücksetzt.

13
Mike

Neben der Antwort von 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);
});

Als ich diesen "Socket auflegen" -Fehler hatte, lag dies daran, dass ich die Anforderungsfehler nicht abfing.

10
FWoelffel

benutzen 

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

Wahrscheinlich wurde Ihre Server-Socket-Verbindung irgendwie geschlossen, bevor alle http.ServerResponse-Objekte beendet wurden. Stellen Sie sicher, dass Sie alle eingehenden Anforderungen gestoppt haben, bevor Sie mit eingehenden Verbindungen etwas tun (eingehende Verbindungen unterscheiden sich etwas von eingehenden HTTP-Anforderungen).

0