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?

0voto

Peter Akinlolu Punkte 33

Node JS Socket ist nicht blockierend io. Erwägen Sie die Verwendung einer nicht blockierenden io-Verbindung aus anderen Quellen. Wenn Sie beispielsweise einen blockierenden Java Socket mit Node verwenden, funktioniert es nur für wenige Sekunden, danach wird ein Fehler angezeigt. Beheben Sie dies, indem Sie eine nicht blockierende Verbindung implementieren, d.h. Sockelkanal mit dem Selektor.

0voto

Sherin Punkte 9

Zuerst führe ich meine App aus, ich habe ECONNRESET bekommen, danach habe ich einen Fehler wie ECONNREFUSED bekommen. Ich hatte beide Probleme beim Ausführen meiner node App. Für beide Probleme stellte ich fest, dass dies auftrat, weil der wampserver nicht gestartet wurde. Ich verwende die MySQL Datenbank in meiner App, um die Daten mit Hilfe des wampservers zu erhalten. Ich löse dies, indem ich den wampserver starte und dann meine Node-App ausführe. Es funktioniert gut. Sie können node oder nodemon verwenden, um die Node-Anwendung auszuführen. Das ist nicht das Problem in meinem Fall.

0voto

Ajay Punkte 1

Einige Optionen, die ich ausprobiert habe und als temporäre Lösungen funktioniert haben

  1. Wenn Sie Node verwenden, versuchen Sie, zwischen verschiedenen Node-Versionen mit node use #version# zu wechseln. Hat bei mir funktioniert
  2. Versuchen Sie, die Internetverbindung zu wechseln

0voto

NecipAllef Punkte 447

In meinem Fall war die node-Version das Problem. Die Anwendung gab den Fehler ECONNRESET mit v16.14.2 aus, aber es funktionierte gut mit v18.16.0. Ich benutze n, um die node-Versionen zu verwalten.

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