Estou executando um aplicativo Express.js usando o Socket.io para um aplicativo de bate-papo e recebo o seguinte erro aleatoriamente cerca de 5 vezes durante 24h. O processo do nó é encerrado para sempre e é reiniciado imediatamente.
O problema é que reiniciar o Express expulsa meus usuários de suas salas e ninguém quer isso.
O servidor da web é proxy por HAProxy. Não há problemas de estabilidade de soquete, apenas usando transportes de websockets e flashsockets. Não posso reproduzir isso de propósito.
Este é o erro com o nó 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 (22/07/2013)
Adicionados o manipulador de erros do cliente socket.io e o manipulador de exceções não capturado. Parece que este captura o erro:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Portanto, suspeito que não seja um problema do Socket.io, mas uma solicitação HTTP para outro servidor que eu faço ou uma conexão MySQL / Redis. O problema é que a pilha de erros não me ajuda a identificar meu problema de código. Aqui está a saída do log:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Como sei o que causa isso? Como aproveito ao máximo o erro?
Ok, não muito detalhado, mas aqui está o stacktrace com 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] ] } }
Aqui eu sirvo o arquivo de política do soquete flash:
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)
Essa pode ser a causa?
Respostas:
Você já deve ter adivinhado: é um erro de conexão.
"ECONNRESET" significa que o outro lado da conversa do TCP fechou abruptamente o final da conexão. Provavelmente, isso ocorre devido a um ou mais erros de protocolo do aplicativo. Você pode olhar para os logs do servidor da API para ver se há alguma reclamação.
Mas como você também está procurando uma maneira de verificar o erro e potencialmente depurar o problema, consulte " Como depurar um erro de interrupção de soquete no NodeJS? ", Publicado no stackoverflow em relação a uma pergunta semelhante.
EDIT (22/07/2013)
Como escrevi acima:
O que também poderia ser o caso: em momentos aleatórios, o outro lado está sobrecarregado e simplesmente mata a conexão como resultado. Se for esse o caso, depende exatamente do que você está se conectando ...
Mas uma coisa é certa: você realmente tem um erro de leitura na sua conexão TCP que causa a exceção. Você pode ver isso observando o código de erro que você postou em sua edição, o que o confirma.
fonte
Um servidor tcp simples que eu tinha para servir o arquivo de políticas flash estava causando isso. Agora posso pegar o erro usando um manipulador:
fonte
socket.destroy()
o manipulador de erros para ter certeza. Infelizmente, não consigo encontrar a documentação necessária, mas ela não emite um erro.Eu tive um problema semelhante em que os aplicativos começaram a apresentar erros após uma atualização do Node. Acredito que isso possa ser rastreado até a versão Nó v0.9.10 deste item:
As versões anteriores não apresentariam erros nas interrupções do cliente. Uma interrupção na conexão do cliente lança o erro ECONNRESET no nó. Acredito que essa funcionalidade seja destinada ao Node, portanto a correção (pelo menos para mim) foi lidar com o erro, o que acredito que você fez em exceções não capturadas. Embora eu lide com isso no manipulador net.socket.
Você pode demonstrar isso:
Crie um servidor de soquete simples e obtenha o Node v0.9.9 e v0.9.10.
Inicie usando a v0.9.9 e tente fazer o FTP neste servidor. Estou usando FTP e porta 21 apenas porque estou no Windows e tenho um cliente FTP, mas nenhum cliente telnet é útil.
Então, do lado do cliente, basta interromper a conexão. (Estou apenas fazendo Ctrl-C)
Você deve ver SEM ERRO ao usar o Nó v0.9.9 e ERRO ao usar o Nó v.0.9.10 e superior.
Na produção, eu uso a v.0.10. alguma coisa e ainda dá o erro. Mais uma vez, acho que isso se destina e a solução é lidar com o erro no seu código.
fonte
Teve o mesmo problema hoje. Após alguma pesquisa, encontrei uma
--abort-on-uncaught-exception
opção node.js muito útil . Ele não apenas fornece um rastreamento de pilha de erros muito mais detalhado e útil, mas também salva o arquivo principal na falha do aplicativo, permitindo mais depuração.fonte
Eu estava enfrentando o mesmo problema, mas mitiguei-o colocando:
antes
server.listen
.server
é um servidor HTTP aqui. O tempo limite padrão é de 2 minutos, conforme a documentação da API .fonte
Outro caso possível (mas raro) pode ser se você tiver comunicações servidor a servidor e tiver definido
server.maxConnections
um valor muito baixo.Na lib principal do net , net.js , chamará o
clientHandle.close()
que também causará o erro ECONNRESET:fonte
maxConnections
o valor padrão éInfinity
. Este seria apenas o caso (como você disse) se você tiver substituído explicitamente esse valor.Sim, sua veiculação do arquivo de políticas pode definitivamente causar a falha.
Para repetir, basta adicionar um atraso ao seu código:
… E use
telnet
para conectar à porta. Se você desconectar o telnet antes que o atraso expire, ocorrerá uma falha (exceção não detectada) quando o socket.write gerar um erro.Para evitar a falha aqui, basta adicionar um manipulador de erros antes de ler / gravar o soquete:
Ao tentar a desconexão acima, você receberá uma mensagem de log em vez de uma falha.
E quando terminar, lembre-se de remover o atraso.
fonte
Eu também recebo o erro ECONNRESET durante o meu desenvolvimento, da maneira que o resolvo é por não usar o nodemon para iniciar meu servidor, apenas o uso
"node server.js"
para iniciar meu servidor corrigiu meu problema.É estranho, mas funcionou para mim, agora nunca mais vejo o erro ECONNRESET.
fonte
Eu também tinha esse erro e consegui resolvê-lo após dias de depuração e análise:
minha solução
Para mim, o VirtualBox (para Docker) foi o problema. Eu tinha o encaminhamento de porta configurado na minha VM e o erro ocorreu apenas na porta encaminhada.
conclusões gerais
As seguintes observações podem economizar dias de trabalho que tive que investir:
-> descubra se algo está mexendo com sua rede (configurações), como VMs, firewalls etc., essa provavelmente é a causa do problema.
fonte
Resolvi o problema simplesmente conectando-me a uma rede diferente . Esse é um dos possíveis problemas.
Como discutido acima, ECONNRESET significa que a conversa TCP fechou abruptamente seu final da conexão.
Sua conexão à Internet pode estar impedindo a conexão com alguns servidores. No meu caso, eu estava tentando conectar-se ao mLab (serviço de banco de dados em nuvem que hospeda bancos de dados MongoDB). E meu ISP está bloqueando isso.
fonte
Eu resolvi esse problema:
npm update
no terminal para atualizar o npm.Depois disso, tentei o mesmo comando npm e o bom foi que funcionou. Eu não tinha certeza se é assim tão simples.
Estou usando o CENTOS 7
fonte
Eu tive o mesmo problema e parece que a versão do Node.js foi o problema.
Instalei a versão anterior do Node.js (10.14.2) e tudo estava bem usando o nvm (permite instalar várias versões do Node.js e alternar rapidamente de uma versão para outra).
Não é uma solução "limpa", mas pode atendê-lo temporariamente.
fonte
Acabei de descobrir isso, pelo menos no meu caso de uso.
Eu estava recebendo
ECONNRESET
. Aconteceu que, da maneira como meu cliente foi configurado, ele estava atingindo o servidor com uma chamada de API várias vezes muito rapidamente - e só precisava atingir o ponto de extremidade uma vez.Quando consertei isso, o erro se foi.
fonte
Tente adicionar essas opções ao socket.io:
Eu espero que isso te ajude !
fonte