Node js ECONNRESET

Eu m execută o Exprima js aplicație cu soclu.io pentru un chat webapp și primesc următoarea eroare la întâmplare în jurul valorii de 5 ori în timpul 24h. Nodul proces este înfășurat într-o veșnicie și se restarteaza în sine imediat.

Problema este că repornirea express lovituri mea utilizatorilor din camerele lor și nimeni nu vrea asta.

Serverul web este aproximat prin HAProxy. Nu există priză de probleme de stabilitate, folosind doar websockets și flashsockets transporturi. Eu nu pot reproduce acest scop.

Aceasta este eroarea cu nod 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)

Adăugat ambele socket.io client error handler și excepție neprins handler. Se pare că asta prinde de eroare:

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

Deci bănuiesc că's nu o priză.io problema, dar o cerere http către un alt server pe care am face sau mysql/redis conexiune. Problema este că stiva de eroare nu't mă ajute să-mi identific cod problemă. Aici este jurnalul de ieșire:

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

Cum știu ce cauzeaza asta? Cum pot obține mai mult de la eroare?

Ok, nu foarte detaliat, dar aici e stacktrace cu "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] ] } }

Aici servesc flash socket politica fișier:

net = require("net")
net.createServer( (socket) =>
  socket.write("<?xml version=\"1.0\"?>\n")
  socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
  socket.write("<cross-domain-policy>\n")
  socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
  socket.write("</cross-domain-policy>\n")
  socket.end()
).listen(843)

Poate fi aceasta cauza?

Comentarii la întrebare (14)

Ai ghicit deja: it's o eroare de conexiune.

"ECONNRESET" mijloace de cealaltă parte a TCP conversația brusc și-a închis capăt al conexiunii. Acest lucru se datorează cel mai probabil unul sau mai multe application protocol erori. Te-ai putea uita la API jurnalele de server pentru a vedea dacă acesta se plânge de ceva.

Dar, din moment ce sunt, de asemenea, în căutarea pentru o modalitate de a verifica eroare și eventual depana problema, tu ar trebui să ia o privire la "Cum pentru a depana un soclu închide eroare în NodeJS?" care a fost postat la stackoverflow în legătură cu o la fel de întrebare.

Rapid și murdar soluție pentru dezvoltare:

Utilizați longjohn, veți obține mult stivă, care va conține asincron operațiuni.

Curat și soluție corectă: Din punct de vedere tehnic, în nod, ori de câte ori emit o &#39;eroare&#39; eveniment și nimeni nu ascultă, se va arunca. Pentru a face nu arunca, pune un ascultător pe ea și să se ocupe de tine. În acest fel vă puteți conecta de eroare, cu mai multe informații.

Pentru a fi un ascultător pentru un grup de apeluri, puteți utiliza domenii și, de asemenea, prinde alte erori în execuție. Asigurați-vă că fiecare asincron funcționare legate de http(Server/Client) este în diferite domeniu contextul în comparație cu alte părți din cod, domeniu va asculta în mod automat la "eroare" de evenimente și se va propaga la's propriul handler. Deci asculti numai că handler și pentru a obține date de eroare. Te, de asemenea, obține mai multe informații pentru drum liber.

EDIT (2013-07-22)

Cum am scris mai sus:

"ECONNRESET" mijloace de cealaltă parte a TCP conversația brusc și-a închis capăt al conexiunii. Acest lucru se datorează cel mai probabil unul sau mai multe application protocol erori. Te-ai putea uita la API jurnalele de server pentru a vedea dacă acesta se plânge de ceva.

Ce ar putea fi, de asemenea, cazul a: la momente aleatorii, cealaltă parte este supraîncărcat și pur și simplu ucide conexiunea ca un rezultat. Dacă asta's la caz, depinde de ceea ce ai're conectarea la exact...

Dar un lucru's sigur: aveți într-adevăr o eroare de citire pe conexiune TCP care provoacă o excepție. Puteți vedea că uitându-te la codul de eroare ai postat in editare, care o confirmă.

Comentarii (4)
Soluția

Un simplu server tcp am avut pentru a servi flash politica fișier a fost cauza asta. Acum pot prinde de eroare folosind un handler:

# serving the flash policy file
net = require("net")

net.createServer((socket) =>
  //just added
  socket.on("error", (err) =>
    console.log("Caught flash policy server socket error: ")
    console.log(err.stack)
  )

  socket.write("<?xml version=\"1.0\"?>\n")
  socket.write("\n")
  socket.write("\n")
  socket.write("\n")
  socket.write("\n")
  socket.end()
).listen(843)
Comentarii (5)

Am avut o problemă similară în cazul în care aplicațiile au început erroring după un upgrade de Nod. Cred că acest lucru poate fi urmărite înapoi la Nodul de presă v0.9.10 acest produs:

  • net: don't suprima ECONNRESET (Ben Noordhuis)

Versiunile anterioare nu't de eroare pe întreruperile de la client. O pauză în care conexiunea de la client aruncă eroare ECONNRESET în Nod. Cred că acest lucru este destinat funcționalitate pentru Nod, deci fix (cel puțin pentru mine) a fost să se ocupe de eroare, ceea ce cred că ai făcut-o în neprins excepții. Deși mă ocup de el în plasă.soclu handler.

Puteți demonstra acest lucru:

Face un simplu socket server și a obține Nod v0.9.9 și v0.9.10.

require('net')
    .createServer( function(socket) 
    {
           // no nothing
    })
    .listen(21, function()
     {
           console.log('Socket ON')
    })

Porniți-l în sus, folosind v0.9.9 și apoi încercarea de a FTP pentru acest server. Am'm folosind FTP și portul 21 doar pentru că m-am'm pe Windows și au un client FTP, dar nu telnet client la îndemână.

Apoi, din partea clientului, doar rupe legătura. (M-am'm a face doar Ctrl-C)

Ar trebui să vedeți NICI o EROARE atunci când se utilizează Nod v0.9.9, și de EROARE atunci când se utilizează Nod v. 0.9.10 și în sus.

În producție, am de utilizare v. 0.10. ceva și încă mai dă eroare. Din nou, cred că acest lucru este destinat și soluția este să se ocupe de eroare în cod.

Comentarii (2)

A avut aceeași problemă astăzi. După unele cercetări am găsit-o foarte util --abandona pe neprins-excepție node.js opțiune. Nu numai că oferă mult mai detaliată și utile eroare stivei, dar salvează, de asemenea, fișiere de bază privind aplicarea accident și să permită continuarea debug.

Comentarii (1)

Am fost confruntă cu aceeași problemă, dar am atenuat-o prin plasarea:

server.timeout = 0;

înainte de server.asculta. server este un server HTTP aici. Implicit timeout este de 2 minute ca pe documentație API.

Comentarii (1)

Un alt caz posibil (dar rar) ar putea fi dacă ai server la server de comunicații și au stabilit server.maxConnections` la o valoare foarte scăzută.

În nod's core lib net.js se va numi clientHandle.close()` care va provoca, de asemenea, eroare ECONNRESET:

if (self.maxConnections && self._connections >= self.maxConnections) {
  clientHandle.close(); // causes ECONNRESET on the other end
  return;
}
Comentarii (1)

Da, de servire a politicii de fișiere pot provoca cu siguranta accident.

Pentru a repeta, trebuie doar să adăugați o întârziere de cod:


net.createServer( function(socket) 
{
  for(i=0; i
Comentarii (0)

Am obține, de asemenea, ECONNRESET eroare în timpul de dezvoltare, așa cum am rezolva este de nu utilizarea nodemon pentru a porni serverul meu, doar folosi"nod server.js" pentru a începe serverul meu fix problema mea.

L's ciudat, dar pentru mine a mers, acum n-am vedea ECONNRESET eroare din nou.

Comentarii (0)

Am avut această Eroare prea și a fost capabil să-l rezolve după zile de depanare și analiză:

soluția mea

Pentru mine VirtualBox (pentru Docker) a fost Problema. Am configurat Port Forwarding pe NEG și erori aparute pe înaintat port.

concluzii generale

Următoarele observații pot salva de zile de munca am avut de a investi:

  • Pentru mine singura problema a avut loc pe conexiuni de la localhost la localhost pe un port. -> verificați schimbarea oricare dintre aceste constante rezolvă problema.
  • Pentru mine singura problema a avut loc pe masina mea -> lasă pe altcineva să-l încercați.
  • Pentru mine singura problema a apărut după un timp și n't fi reproduse în mod fiabil
  • Problema mea n't fi inspectate cu oricare dintre noduri sau exprimă (debug-)instrumente. -> nu't pierde timpul pe acest

-> mi dau seama dacă ceva este în jur de joc cu dvs. de rețea (setări), ca VMs, Firewall-uri, etc., aceasta este probabil cauza problemei.

Comentarii (0)

Am rezolvat problema prin simpla conectarea la o altă rețea. Asta este una din posibilele probleme.

Cum sa discutat mai sus, ECONNRESET înseamnă că TCP conversația brusc și-a închis capăt al conexiunii.

Conexiunea la internet ar putea fi blocarea de la conectarea cu unele servere. În cazul meu, am încercat să se conecteze la mLab ( baza de date cloud serviciul care găzduiește baze de date MongoDB). Si ISP-ul meu este o blochează.

Comentarii (1)

Am rezolvat această problemă prin:

  • Oprirea meu wifi/conexiune ethernet și porniți.
  • Am scris: npm update în terminal pentru a actualiza npm.
  • Am încercat să vă conectați de la sesiune și conectați-vă din nou

După aceea am încercat același npm comandă și lucrul bun a fost că s-a rezolvat. Am fost't de sigur este atât de simplu.

Eu folosesc CENTOS 7

Comentarii (0)

Încercați să adăugați aceste opțiuni pentru a socket.io:

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

Sper că acest lucru vă va ajuta !

Comentarii (0)