web-dev-qa-db-fra.com

Comment déboguer une erreur de raccrochage de socket dans NodeJS?

Je reçois l'erreur suivante:

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)

Dans le nœud v0.6.6, mon code comporte plusieurs appels http.request et .get . Veuillez suggérer des moyens de suivre les causes du blocage du socket et sur la requête/appel correspondant .. ..

44
user971956

Solution rapide et sale pour le développement:

Utilisez longjohn , vous obtenez des traces de pile longues qui contiendront les opérations asynchrones.

Solution propre et correcte: Techniquement, dans le noeud, chaque fois que vous émettez un événement 'error' et que personne ne l'écoute, il jette . Pour ne pas le jeter, placez un auditeur dessus et manipulez-le vous-même. De cette façon, vous pouvez enregistrer l'erreur avec plus d'informations.

Pour avoir un auditeur pour un groupe d'appels, vous pouvez utiliser -domaines et aussi détecter d'autres erreurs lors de l'exécution. Assurez-vous que chaque opération asynchrone liée à http (serveur/client) se trouve dans un contexte domain différent des autres parties du code, le domaine écoutera automatiquement les événements error et le transmettra à son propre gestionnaire. Vous n'écoutez donc que ce gestionnaire et obtenez les données d'erreur. Vous obtenez également plus d'informations gratuitement.(Les domaines sont déconseillés). 

Comme Mike l’a suggéré, vous pouvez également définir NODE_DEBUG=net ou utiliser strace . Ils vous fournissent tous les deux ce que le noeud fait en interne. 

37
Farid Nouri Neshat

En outre, vous pouvez définir la variable d'environnement NODE_DEBUG sur net pour obtenir des informations sur ce que font tous les sockets. De cette façon, vous pouvez isoler quelle ressource distante réinitialise la connexion.

13
Mike

En plus de la réponse de 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);
});

Quand j’ai eu cette erreur "socket raccroche", c’est parce que je n’ai pas intercepté les erreurs des requêtes.

10
FWoelffel

utilisation 

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

Très probablement, votre connexion de socket serveur était en quelque sorte fermée avant la fin de tous les objets http.ServerResponse. Assurez-vous que vous avez arrêté toutes les demandes entrantes avant de faire quelque chose avec les connexions entrantes (la connexion entrante est quelque chose de différent de la demande HTTP entrante).

0