421 Stimmen

Wie behebe ich den Fehler ECONNRESET in Node.js?

Ich betreibe eine Express.js-Anwendung, die Socket.io für eine Chat-Webanwendung verwendet, und ich erhalte den folgenden Fehler sporadisch etwa 5 Mal innerhalb von 24 Stunden. Der Node-Prozess ist in forever eingebunden und startet sich sofort neu.

Das Problem ist, dass das Neustarten von Express meine Benutzer aus ihren Räumen wirft und das möchte niemand.

Der Webserver wird von HAProxy proxied. Es gibt keine Probleme mit der Socket-Stabilität, es werden nur Websockets und Flashsockets-Transports verwendet. Ich kann diesen Fehler nicht absichtlich reproduzieren.

Das ist der Fehler mit 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

EDIT (2013-07-22)

Habe sowohl den Fehlerhandler für den socket.io-Client als auch den unerfassten Ausnahme-Handler hinzugefügt. Es scheint, dass dieser den Fehler erfasst:

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

Ich vermute also, dass es kein Socket.io-Problem ist, sondern eine HTTP-Anfrage an einen anderen Server, die ich mache, oder eine MySQL/Redis-Verbindung. Das Problem ist, dass der Fehler-Stack mir nicht hilft, meinen Codefehler zu identifizieren. Hier ist die Protokollausgabe:

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

Wie kann ich herausfinden, was das verursacht? Wie bekomme ich mehr Informationen aus dem Fehler?

Okay, nicht sehr ausführlich, aber hier ist der Stacktrace mit 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] ] } }

Hier bediene ich die Flash-Socket-Richtliniendatei:

    net = require("net")
    net.createServer( (socket) =>
      socket.write("\n")
      socket.write("\n")
      socket.write("\n")
      socket.write("\n")
      socket.write("\n")
      socket.end()
    ).listen(843)

Kann das die Ursache sein?

7voto

Yousef Punkte 450

Ich habe das Problem einfach gelöst, indem ich mich einfach mit einem anderen Netzwerk verbunden habe. Das ist eines der möglichen Probleme.

Wie oben erwähnt, bedeutet ECONNRESET, dass das TCP-Gespräch abrupt an seinem Ende der Verbindung geschlossen wurde.

Ihre Internetverbindung blockiert möglicherweise den Zugriff auf bestimmte Server. In meinem Fall habe ich versucht, eine Verbindung zu mLab herzustellen (ein Cloud-Datenbankservice, der MongoDB-Datenbanken hostet). Und mein Internetdienstanbieter blockiert dies.

5voto

muhammad tayyab Punkte 692

Ich hatte dieses Problem gelöst, indem ich:

  • Meine WLAN / Ethernet-Verbindung aus- und eingeschaltet habe.
  • Ich habe npm update im Terminal eingegeben, um npm zu aktualisieren.
  • Ich habe versucht, mich abzumelden und mich erneut anzumelden

Nachdem ich den gleichen npm-Befehl ausprobiert hatte, funktionierte es gut. Ich war mir nicht sicher, ob es so einfach ist.

Ich benutze CENTOS 7

5voto

VikR Punkte 4166

Ich habe das gerade herausgefunden, zumindest in meinem Anwendungsfall.

Ich habe ECONNRESET erhalten. Es stellte sich heraus, dass mein Client so eingestellt war, dass er den Server mit einem API-Aufruf sehr oft und sehr schnell getroffen hat - obwohl es nur einmal erforderlich war, das Endpunkt zu erreichen.

Als ich das behoben habe, war der Fehler verschwunden.

3voto

Sylvain Punkte 1

Ich hatte das gleiche Problem und es scheint, dass die Node.js-Version das Problem war.

Ich habe die vorherige Version von Node.js (10.14.2) installiert und alles war in Ordnung, indem ich nvm verwendet habe (es ermöglicht Ihnen, mehrere Versionen von Node.js zu installieren und schnell von einer Version zur anderen zu wechseln).

Es ist keine "saubere" Lösung, aber es kann Ihnen vorübergehend helfen.

0voto

sol404 Punkte 1623

Versuchen Sie, diese Optionen zu socket.io hinzuzufügen:

const options = { transports: ['websocket'], pingTimeout: 3000, pingInterval: 5000 };

Ich hoffe, das wird Ihnen helfen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X