ECONNRESET торабы

Сөйлесу үшін socket.io арқылы Express JS бағдарламасын іске қосамын    webapp және мен келесі қатені шамамен 5 рет кездестіремін    24h. Түйін процесі мәңгіге оралып, қайта іске қосылады    дереу өзіне.

Мәселе мынада, жылдамдығын қайта бастау менің пайдаланушыларымды өз бөлмелерінен тыс бастады    және ешкім оны қаламайды.

Веб-сервер HAProxy арқылы проксиге алынады. Websockets және flashsockets көліктерін пайдалану арқылы ұяшыққа тұрақтылыққа қатысты мәселелер жоқ. Мен бұл мақсатқа жете алмаймын.

Бұл 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)

Socket.io клиент қатесі өңдегішін де, сондай-ақ алынбайтын ерекше өңдегішін де қосылды. Бұл қатені тапқан деп санайды:

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

Сондықтан, менің ойымша бұл socket.io мәселесі емес, бірақ менің жасайтын басқа серверге немесе mysql/redis қосылымына қатысты сұрау. Мәселе мынада, қате стекі менің код мәселемді анықтауға көмектеспейді. Журнал шығарылымы:

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

Мұның себебі не екенін білемін? Қатені қалай аламын?

Жақсы емес, бірақ мұнда «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] ] } }

Мұнда мен флэш сокет саясатының файлына қызмет етемін:

net = require("net")
net.createServer( (socket) =>
  socket.write("<?xml version=\"1.0\"?>\n")
  socket.write("\n")
  socket.write("\n")
  socket.write("\n")
  socket.write("\n")
  socket.end()
).listen(843)

Бұл себеп болуы мүмкін бе?

196
Жай ғана process.on ('uncaughtException', function (err) {...}) дегенді қосу үшін бұл сұрыпталған. Бұл мәселенің түп-тамырына түспейді, бірақ қате мен үшін өте сирек кездеседі, бұл тез және лас шешім менің пайдалану жағдайыма сәйкес келеді.
қосылды автор JoeRocc, көзі
ECONNRESET желілік проблемадан туындауы мүмкін. Өздеріңіз білесіздер, тестілеу кезінде барлық ерекшеліктерді ұстап алу мүмкін емес. Кейбірі сіздің өндіріс серверіңізде көрсетіледі. Серверіңізді сенімді етуіңіз керек. Сессияның жойылуын Redis сақтау ретінде пайдалана аласыз. Бұл торап серверінің өшкеннен кейін де сеанстарыңызды сақтайды.
қосылды автор user568109, көзі
Қате орын алған серверден тиісті коды көрсете аласыз ба? Немесе, кем дегенде, қатені қайта шығаратын кейбір ең аз код. Кодты қарастырмай қиындық туғызады.
қосылды автор user568109, көзі
Байланысты: егер бұл біреудің бұлтты/PaaS ұсыныстарында болғанын көретін болса, онда даналар төмендейді (тыныш уақытта).
қосылды автор opyate, көзі
сияқты ескерту: менің жағдайда бұл бала процесінде жүреді stdio емес, tcp розетка немесе тағы бір нәрсе. жай шикі стьдио. қазір бұл uncectionException оқиғасын көріңіз. рахмет.
қосылды автор GottZ, көзі
Socket.error @Gottz көмектеспейді, бірақ process.on ('uncaughtException') қатені жабады. Қатенің console.log: {[Қате: ECONNRESET] коды: ECONNRESET, errno: 'ECONNRESET', syscall: 'read'}
қосылды автор Samson, көзі
github.com/joyent/node/releases/tag/v0.10.12 Сокет жазуға арналған түзетуді көру. жаңартылады
қосылды автор Samson, көзі
@ user568109 мұнда кейбір маңызды бөліктер (егер сіз Coffeescript-да жазылған болсаңыз) gist.github.com/samsonradu/5585b0f4a101fee3cab4
қосылды автор Samson, көзі
@Moss қосылған клиенттерді анықтайды. Торап сервері тек қана веб-тораптағы қосылымдарды тыңдайды және оларда қате өңдегіші бар.
қосылды автор Samson, көзі
Неліктен бұл сеансты жоюмен байланысты? Олар бәрібір Redis тарапынан өңделеді.
қосылды автор Samson, көзі
@GottZ бұл көмектесуі мүмкін (js торабында жұмыс істейтін біреуге сөйлесе) gist.github.com/samsonradu/1b0c6feb438f5a53e30e . Мен бүгін socket.error өңдегішін қолданамын және сізге хабарлауды ұсынамын.
қосылды автор Samson, көзі
Сізде кемінде бір TCP сокетінің тыңдаушысы бар, ол өңдегіш жиынтығы жоқ. Ендеше, енді қайда екенін тексеру керек: D
қосылды автор Moss, көзі
Бұл сізді байланыстырылған клиенттеріңіздің бірінен ұяшықтың үзілуін алып тастаған кезде, ол маған жабылады. Процестің өзі емес, барлық байланыстарыңызға «қателік» тыңдаушысын қосып көріңіз.
қосылды автор Moss, көзі
net.js қатені шығаратын кезде, debuglogging көп болса, сіз env.NODE_DEBUG = «net» орнатқаннан кейін бірнеше жүгірулерді алуыңыз мүмкін, содан кейін шығыс көзінің орындарына сәйкес келуі мүмкін.
қосылды автор jjm, көзі

11 жауаптар

Сіз бұны қазірдің өзінде болжаған боларсыз: бұл байланыс қатесі.

"ECONNRESET" means the other side of the TCP conversation abruptly closed its end of the connection. This is most probably due to one or more application protocol errors. You could look at the API server logs to see if it complains about something.

Бірақ сіз қатені тексеру және мәселені ықтимал күйіне келтіру әдісін іздеп жатқандықтан, « Қалай NodeJS-те қатені сөндіруге арналған розетка? «, ол ұқсас мәселе бойынша stackoverflow-де орналастырылған.

Даму үшін жылдам және кірленген шешім :

     

longjohn пайдаланыңыз, сіз асинхрондық әрекеттерді қамтитын ұзын стекке ие боласыз.

     

Таза және дұрыс шешім :     Техникалық түрде, торапта, 'қатесі оқиғасын шығарғанда және ешкім тыңдайды, ол соққы береді . Оны тастамау үшін тыңдаушыға қойып, оны өзіңіз жасаңыз. Осылайша қатені қосымша ақпараттармен жаза аласыз.

     

Қоңыраулар тобы үшін бір тыңдаушыны пайдалану үшін сіз домендерді пайдалана аласыз басқа қателерді орындау кезінде. Http (Сервер/Клиент) байланысты әрбір синхронды операцияның әр түрлі домен контекстті салыстыруына көз жеткізіңіз кодтың басқа бөліктеріне домен error оқиғаларын автоматты түрде тыңдайды және оны өз өңдеушіге таратады. Сондықтан сіз бұл өңдеушіні ғана тыңдап, қате туралы деректерді аласыз. Сіз ақысыз ақысыз ақпарат аласыз.

EDIT (2013-07-22)

Жоғарыда жазғанымдай:

«ECONNRESET» TCP сөйлесуінің басқа жағы қосылыс аяқталғанын бірден жабады. Бұл, ең алдымен, бір немесе бірнеше қолданба хаттамасының қателеріне байланысты.

Қандай жағдай болуы мүмкін: кездейсоқ уақытта басқа жағы шамадан тыс жүктеледі және нәтиже ретінде байланысын өлтіреді. Егер солай болса, дәл осылай қосылуға байланысты ...

Бірақ, бір нәрсе, сөзсіз, сізде TCP қосылымында оқылу қатесі бар, ол алып тастайды. Мұны сіздің репортажыңызда жіберген қате кодын қарап, көре аласыз.

183
қосылды
Бұл «бірден жабық» дегенді білдірмейді. Әдетте әдеттегідей жабық тұрған қосылымға жазудың нәтижесі болады. Бұл RST шығаруға әкеледі.
қосылды автор EJP, көзі
@supershnee Деректеріңіз, бағдарламаңыз және node.js өзі белгісіз күйде болғандықтан, әрдайым серверіңізді әрдайым қайтадан іске қосыңыз. Ерекше жағдайдан кейін жалғастыру деректеріңізге қауіп төндіреді. Егер сіз көбірек білгіңіз келсе Түйіннің құжаттары процесінде тексеріңіз немесе Тораптардағы домендердің құжаттары .
қосылды автор c1moore, көзі
@EJP Мен «күрт» деп жазғанымның жақсы себебі болды. Қате (алдын-ала ескертусіз емес) қосылым арқылы теңшелген. Қолданыстағы қосылыс қашықтан басқару құралымен мәжбүрлеп жабылды. Қажет болғандықтан мәжбүрлеп жабық болды! (Бұл қалыпты жағдайда қашықтағы компьютерге қосылуға арналған бағдарлама кенеттен тоқтатылған болса, машина қайта іске қосылса немесе тең қолданба қолданылса, қашықтағы розеткада «қатты жабу» пайдаланылады. бір немесе одан да көп операция орындалған кезде сәтсіздікті анықтау ... бұл операциялар және кейінгі әрекеттер сәтсіз болады.)
қосылды автор e-sushi, көзі
Браузерден (Chrome) тестілеу үшін бір уақытта браузер 100-ге жуық API қоңырауларын жіберген кезде осы қате жіберілдім. Сонда Chrome шамадан тыс жүктеліп, кейбір қосылымдарды жойғанын елестетемін ... @Samson - өзіңіздің доменіңіздегі әрбір сұрауды өңдей отырып және домендік қателерді серверді қайта іске қоспай ұстаудың қандай қатесі бар?
қосылды автор supershnee, көзі

Флэш-саясат файлына қызмет еткен қарапайым TCP сервері мұның себебі болды. Енді өңдегішті пайдаланып, қатені ұстай аламын:

# 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)
28
қосылды
Мен қате өңдегішінде әрқашан socket.destroy() деп аталады. Өкінішке орай, қажетті құжаттарды таба алмаймын, бірақ ол қате жібермейді.
қосылды автор Joachim Isaksson, көзі
Doh, сіз шешкен шешіміңізді әлдеқайда көп деп жарияламас бұрын көрген емеспіз :) Сіздің сұрағыңызға қатысты болсаңыз да, розетка жазылатындығын тексерсеңіз де, кейінірек оған микросекундтар жазып, қате жіберер еді, сондықтан бұл «жол» сенімді болуы керек.
қосылды автор Joachim Isaksson, көзі
жақсы, және бұл қауіпсіз шығу ма? қате өңдегішінің ішіндегі socket.close() сияқты? өйткені менің ойымша, бұл қателерден кейін CPU жүктемесі артады (сенімді емес)
қосылды автор Samson, көзі
Кодта дұрыс емес нәрсе бар ма? Розетка жазудан бұрын жазу мүмкіндігі бар ма екен?
қосылды автор Samson, көзі
socket.destroy() менің күнімді сақтап қалды, ол жұмыс істейді! Рақмет сізге!
қосылды автор Firas Abd Alrahman, көзі

Түйін жаңартқаннан кейін қолданбалар қате басталған кезде маған ұқсас мәселе болды. Менің ойымша, бұл нәрсе N02.10.10 нұсқасына шығарылды:

  • net: ECONNRESET (Ben Noordhuis) жол бермеңіз

Алдыңғы нұсқалар клиенттің үзілістеріне байланысты қате болмайды. Клиенттен қосылу кезінде үзіліс ECONNRESET қатесін Node торабында қояды. Мен бұл торап үшін функционалдылық деп есептеймін, сондықтан түзету (кем дегенде мен үшін) қателерді шешуге тиіс болды. Мен оны net.socket өңдеушісінде ұстасам да.

Мұны көрсетуіңізге болады:

Қарапайым сокет серверін жасаңыз және Node v0.9.9 және v0.9.10 алыңыз.

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

V0.9.9 арқылы іске қосыңыз да, FTP серверіне әрекет жасаңыз. Мен FTP және 21 портын тек Windows жүйесінде болғандықтан және FTP клиенті болғандықтан ғана пайдаланамын, бірақ Telnet клиенті қолайлы емес.

Содан кейін клиенттік тараптан байланыс үзіңіз. (Мен тек Ctrl-C жасаймын)

Түйін v0.9.9 пайдаланғанда NO ERROR және Node v.0.9.10 және up пайдалану кезінде ERROR көрінуі керек.

Өндірісте мен v.0.10-ды қолданамын. бірдеңе болса да, қате жібереді. Тағы да, менің ойымша, бұл мақсатқа арналады және шешім сіздің кодыңыздағы қатені өңдеуге арналған.

21
қосылды
Сондай-ақ, қатені бұдан былай бастамаған түйіннің нұсқасының өзгеруі туралы білетінмін, бірақ әрқайсысы көрсететін және шешілетін көптеген мәселелерді көріп, соңғы нұсқаға баруды жөн көрдім. Мен V0.10.13 қазір btw пайдаланамын
қосылды автор Samson, көзі
Рахмет, мен оны өзіме іліп қойдым! Қателерді босатуға мүмкіндік бермеу маңызды, себебі ол бүкіл қолданбаны тұрақсыз етеді. Мысалы: 10-ға жуық ECONNRESET қателерді байқағаннан кейін сервер кейде жауап бермеді (тек қана мұздатылған және кез-келген қосылуларды жасамады)
қосылды автор Samson, көзі

Бүгінде бірдей проблема болған еді. Кейбір зерттеулерден кейін өте пайдалы - табылғаннан кейінгі қоспағанда </< код> node.js параметрі . Ол тек қана қателіктерді анық және пайдалы қателіктермен қамтамасыз етеді, сонымен қатар негізгі файлды апаттық күйде сақтауға мүмкіндік береді.

12
қосылды
бұл ескі сұраққа жаңа жауапты қарап тұруым керек, бірақ бұл керемет, рахмет
қосылды автор Semicolon, көзі

Мен сол мәселеге тап болдым, бірақ оны төмендету арқылы жұмсадым:

server.timeout = 0;

алдында server.listen . server - бұл жерде HTTP сервері. Стандартты күту уақыты API құжаттамасына сәйкес 2 минут.

11
қосылды
Бұл шешім емес, тезірек қате жіберместен заттарды бұзатын тезірек.
қосылды автор Nishant Ghodke, көзі

Ия, саясат файлын пайдалану сіздің апатқа әкелуі мүмкін.

Қайталау үшін кодыңызға кешігу қосыңыз:

net.createServer( function(socket) 
{
  for(i=0; i<1000000000; i++);
  socket.write("<?xml version=\"1.0\"?>\n")
…

... және портқа қосылу үшін telnet пайдаланыңыз. Егер сіз телнетті кешіктіру мерзімі аяқталмай тұрып ажыратсаңыз, socket.write қате жібергенде, апатқа ұшырамайсыз (алып тасталмайды).

Ақаулықты болдырмау үшін розетканы оқу/жазу алдында қате өңдегішін қосыңыз:

net.createServer( function(socket) 
{
  for(i=0; i<1000000000; i++);
  socket.on('error', function() { console.log("error"); });
  socket.write("<?xml version=\"1.0\"?>\n")

Жоғарыдағы ажыратылымды байқаған кезде, сіз тек апаттың орнына журнал хабарын аласыз.

Аяқтағаннан кейін кешігуді жоюды ұмытпаңыз.

6
қосылды

Басқа ықтимал оқиға (бірақ сирек) сервер серверіне байланыс орнатқан жағдайда және server.maxConnections параметрін өте төмен мәнге орнатқан болуы мүмкін.

Түйіннің негізгі мәтінінде net.js болады. ECONNRESET қатесін туғызатын clientHandle.close() деп қоңырау шалыңыз:

if (self.maxConnections && self._connections >= self.maxConnections) {
  clientHandle.close();//causes ECONNRESET on the other end
  return;
}
5
қосылды

Сондай-ақ, менің дамуым кезінде ECONNRESET қатесін алсам, серверді іске қосу үшін емес пайдаланып, менің серверімді бастау үшін «түйін server.js» дегенді пайдаланыңыз менің проблемамды шешті.

Бір қызығы, бірақ бұл менің жұмысым болды, енді ECONNRESET қатесін қайтадан көрмеймін.

1
қосылды

Менде бұл қате болды және оны түзету және талдау күндері кейін шеше алды:

Менің шешімім

Мен үшін VirtualBox (Docker үшін) мәселе болды. Менің VM-де конфигурацияланған Порт-Экспедиция болды және қате жіберілген портта ғана пайда болды.

жалпы тұжырымдар

Келесі ескертулер сізге инвестициялауға болатын жұмыс күндерін үнемдейді:

  • For me the problem only occurred on connections from localhost to localhost on one port. -> check changing any of these constants solves the problem.
  • For me the problem only occurred on my machine -> let someone else try it.
  • For me the problem only occurred after a while and couldn't be reproduced reliably
  • My Problem couldn't be inspected with any of nodes or expresses (debug-)tools. -> don't waste time on this

-> figure out if something is messing around with your network (-settings), like VMs, Firewalls etc., this is probably the cause of the problem.

1
қосылды

Мен мәселені басқа желіге қосылу арқылы шешдім. Бұл мүмкін проблемалардың бірі.

Жоғарыда талқыланғандай, ECONNRESET TCP сөйлесуі байланыстың аяқталуын бірден жабады дегенді білдіреді.

Интернет байланысы сізді кейбір серверлерге қосылуға тыйым салуы мүмкін. Менің жағдайда, mLab-ға (MongoDB дерекқорларын иеленетін бұлтты дерекқор қызметі) қосылуға тырыстым. Және менің Интернет провайдерім оны бұғаттайды.

1
қосылды
Бұл маған жұмыс істеді, менің бірнеше сағат жұмыс істеген менің коды кенеттен тоқталып, жұмыс істемейді, желінің өзгеруі проблеманы тудырды
қосылды автор Aklank Jain, көзі

Бұл опцияларды socket.io:

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

Сізге көмектесетініне сенімдімін!

0
қосылды