Comment déboguer une erreur de raccrocher d'une socket dans NodeJS?

j'obtiens 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 noeud v0.6.6, mon code a plusieurs http.demande et .reçois des appels. S'il vous plaît, suggérez des façons de suivre ce qui cause le blocage de la socket, et sur quelle requête/appel il est. Merci

43
demandé sur Farid Nouri Neshat 2012-05-30 14:29:30

5 réponses

Rapide et sale solution pour le développement :

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

Propre et correcte de la solution : Techniquement, dans node, chaque fois que vous émettez un événement 'error' et personne ne l'écoute, il lancera . Faire ne pas jeter, mettre un écouteur et gérer vous-même. De cette façon, vous pouvez enregistrer l'erreur avec plus d'informations.

Pour avoir un listener pour un groupe d'appels, vous pouvez utiliser domaines et aussi attraper d'autres erreurs à l'exécution. Assurez-vous que chaque opération async liée à http(Serveur/Client) est dans un contexte domaine différent par rapport aux autres parties du code, le domaine écoutera automatiquement les événements error et le propagera vers son propre gestionnaire. Donc, vous n'écoutez que de gestionnaire et d'obtenir les données d'erreur. vous obtenez également plus d'informations gratuitement. (les domaines sont dépréciés).

comme Mike 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.

35
répondu Farid Nouri Neshat 2017-11-22 08:21:14

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

13
répondu Mike 2014-01-30 21:39:29

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 hang up", c'était parce que je n'avais pas détecté les erreurs de requêtes.

9
répondu FWoelffel 2014-12-03 10:04:57

utiliser

req.on('error',function(err){})
4
répondu ftft1885 2013-03-16 03:36:03

très probablement votre connexion socket de serveur a été en quelque sorte fermé avant tout http.Les objets ServerResponse sont finis. Assurez-vous que vous avez arrêté toutes les requêtes entrantes avant de faire quelque chose avec les connexions entrantes (la connexion entrante est quelque chose de différent de la requête HTTP entrante).

0
répondu Mateusz Charytoniuk 2013-10-11 08:53:46