Como corrigir o erro: ouça EADDRINUSE enquanto estiver usando o nodejs?

466

Se eu executar um servidor com a porta 80 e tentar usar xmlHTTPrequest, recebo este erro:Error: listen EADDRINUSE

Por que é um problema para o nodejs, se eu quero fazer uma solicitação, enquanto executo um servidor na porta 80? Para os navegadores da web, não há problema: posso navegar na internet enquanto o servidor está em execução.

O servidor é:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

E o pedido:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();
Danny Fox
fonte
Você tem certeza de options.port é definido como 80? O código XHR está sendo executado em um navegador? Você pode executar "nc -l 0.0.0.0 80" quando este servidor não está sendo executado?
Timothy Meade
Veja um problema semelhante em stackoverflow.com/questions/8553957/…
Manohar Reddy Poreddy 26/06/2015
Em qual sistema você está? Alguns sistemas requerem sudo se você deseja ouvir portas abaixo de um determinado limite.
Kebman
esse problema surge porque você executou o servidor nessa porta e não a fechou, o erro diz claramente que a porta já está em uso, isso acontece comigo quando eu abro um novo projeto no código vs sem fechar outros projetos (abrindo (arrastar e soltar))
Ashad Nasim 30 /

Respostas:

412

EADDRINUSEsignifica que o número da porta que listen()tenta ligar o servidor já está em uso.

Portanto, no seu caso, já deve estar executando um servidor na porta 80.

Se você tiver outro servidor da web em execução nessa porta, deverá colocar o node.js por trás desse servidor e proxy por meio dele.

Você deve verificar o listeningevento como este, para ver se o servidor está realmente ouvindo:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);
ensopado
fonte
1
Eu corro apenas este servidor. Antes de iniciar o servidor, o xmlhttprequest funciona. Depois de iniciar o servidor na porta 80, o servidor também funciona perfeitamente. Mas se eu fizer um xmlhttprequest após iniciar o servidor, recebo esse erro.
Danny Fox
6
Isso ainda não gerará um erro se o servidor já estiver ouvindo?
trysis
1
Para mim, isso foi causado pelo Skype
Beep
559

O que realmente me ajudou foi:

killall -9 node

Mas isso matará um processo do sistema.

Com

ps ax

você pode verificar se funcionou.

Patrick
fonte
1
Também para mim. No meu caso eu só executar a função de ouvir duas vezes e tenho o erro na segunda
vabada
2
Em uma nota relacionada, você também pode ler quando não devo kil -9 um processo .
Nobita
12
O problema aqui é que vocês não estão saindo do processo do nó normalmente após a primeira execução. Portanto, o nó ainda está vinculado a essa porta. ps aux | grep nodemostraria isso. Em vez de matar a aplicação com CTRL + Z , sair da aplicação com CTRL + C . Isso sai do aplicativo normalmente e a ligação da porta é removida.
precisa saber é o seguinte
22
Mais de 150 votos para uma solução que equivale a atingir seu software com um martelo.
LeeGee
1
Essa solução é bastante problemática, pois o sinalizador -9 interromperá o processo sem liberar a memória. Você realmente deve usar isso apenas como uma última solução.
Yaki Klein
279

O mencionado killall -9 node, sugerido por Patrick, funciona conforme o esperado e resolve o problema, mas você pode ler a parte de edição desta resposta sobre o porquê.kill -9 não ser a melhor maneira de fazê-lo.

Além disso, convém direcionar um único processo, em vez de matar cegamente todos os processos ativos.

Nesse caso, primeiro obtenha o ID do processo (PID) do processo em execução nessa porta (por exemplo, 8888):

lsof -i tcp:8888

Isso retornará algo como:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

Então faça (ps - na verdade não . Por favor, continue lendo abaixo):

kill -9 57385

Você pode ler um pouco mais sobre isso aqui .

Edição: Eu estava lendo sobre um tópico bastante relacionado hoje e me deparei com este tópico interessante sobre por que eu não deveria kill -9um processo .

Geralmente, você deve usar kill -15 antes de kill -9 para dar ao processo de destino a chance de se limpar. (Os processos não podem capturar ou ignorar o SIGKILL, mas podem e muitas vezes capturam o SIGTERM.) Se você não der ao processo a chance de concluir o que está fazendo e limpar, poderá deixar arquivos corrompidos (ou outro estado) por perto. que não será capaz de entender depois de reiniciado.

Portanto, como declarado, você deve matar melhor o processo acima com:

kill -15 57385

EDIT 2 : Como observado em um comentário por aqui muitas vezes, esse erro é consequência de não sair de um processo normalmente. Isso significa que muitas pessoas saem de um comando de nó (ou qualquer outro) usando CTRL + Z . A maneira correta de interromper um processo em execução é emitir o CTRL + C comando que executa uma saída limpa.

Sair de um processo da maneira correta liberará essa porta ao desligar. Isso permitirá que você reinicie o processo sem ter o trabalho de matá-lo antes de poder executá-lo novamente.

Nobita
fonte
Onde devo executar este comando? No prompt de comando? No console do NPM?
Ulysses Alves
O @UlyssesAlves apenas abre uma janela do terminal e mata o processo a partir daí.
Nobita
@Nobita Isso funciona no Windows? Agora percebo que pode ser um comando do MAC OS. De qualquer forma, reiniciei o meu PC e não recebi mais esse erro. Eu acho que algum outro aplicativo estava usando o mesmo nó da porta estava tentando usar.
Ulysses Alves
2
pgrep nodemostra se algum processo do nó foi executado em você. pkill nodevai matá-los.
precisa saber é
3
não para janelas, povos - você tem que tentar outra porta ou reinicialização do computador: P
Tom Stickel
62

Às vezes, o Skype às vezes escuta na porta 80 e, portanto, causa esse erro se você tentar escutar na porta 80 o Node.js ou qualquer outro aplicativo.

Você pode desativar esse comportamento no Skype acessando as opções e clicando em Avançado -> Conexão -> Usar porta 80 (Desmarque isso)

Desativar o uso da porta 80 do Skype

PS Depois de fazer essa alteração, não se esqueça de reiniciar o Skype!

Rob Evans
fonte
14
PS Depois de fazer essa alteração, não se esqueça de reiniciar o Skype!
Rob Evans
16
Essa é uma das falhas de design mais estonteantes que já vi. Como insano são o Skype devs que eles sempre considerar tomar mais de 80 ou 443?
AJB 21/09
5
Grande +1 para suas habilidades de depuração, Rob.
AJB 21/09
@AJB Eles fizeram isso para tentar perfurar firewalls que limitam o tráfego de saída a solicitações HTTP, mas onde os firewalls não estão usando DPI, basta fazer o bloqueio básico de portas. Ainda assim ... é um pouco tolo ativar isso por padrão!
Rob Evans
Sim, isso me ocorreu depois de pensar um pouco sobre por que eles fariam isso. Ainda assim, um argumento realmente feio. E a ideia de que é ativada por padrão é simplesmente arrogante.
AJB 22/09
39

Você deve tentar matar o processo que está escutando na porta 80.

Killall matará todos os aplicativos do nó em execução. Você pode não querer fazer isso. Com este comando, você pode matar apenas o aplicativo que está escutando em uma porta conhecida.

Se estiver usando o unix, tente este comando:

sudo fuser -k 80/tcp    
Yaki Klein
fonte
1
Obrigado Yaki. O nó killall falhou para mim, mas isso funcionou.
Pat M
Obrigado! killall e lsof -i não funcionaram para mim, mas funcionaram.
karfus
1
Você pode não querer matar todos os aplicativos do nó em execução.
Yaki Klein
28

Motivo do erro: você está tentando usar o ocupadoport number

Duas soluções possíveis para Windows / Mac

  1. Número de porta usado atualmente gratuito
  2. Selecione outro número de porta para o seu programa atual


1. Número da Porta Livre

janelas

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

insira a descrição da imagem aqui

Mac

Você pode tentar o netstat

netstat -vanp tcp | grep 3000

Para OSX El Capitan e mais recente (ou se o seu netstat não suportar -p), use lsof

sudo lsof -i tcp:3000

se isso não resolver o seu problema, os Macusuários poderão consultar a discussão completa sobre esse problema Localizar (e matar) o processo bloqueando a porta 3000 no Mac


2. Alterar número da porta?

janelas

set PORT=5000

Mac

export PORT=5000
WasiF
fonte
você pode fazer em um comando em janelas também:netstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Z. Khullah
27

Sob um ambiente de controlador, você pode usar:

pkill node Antes de executar seu script, faça o trabalho.

Tenha em mente que este comando matará todos os node processos, o que pode estar correto se você tiver, por exemplo, um contêiner executando apenas uma instância, ou seja, você possui um ambiente onde pode garantir isso.

Em qualquer outro cenário, recomendo o uso de um comando para eliminar um determinado ID ou nome de processo encontrado, procurando-o programaticamente. como se seu processo fosse chamado node-server-1, você poderia fazer pkill node-server-1.

Este recurso pode ser útil para entender: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

Javier Cobos
fonte
2
pgrep nodeantes da mão se você quiser ser um pouco cuidadoso e ver o que nodeos processos estão funcionando
Josh.F
1
Totalmente !, eu estava falando no caso de ser um contêiner ou local muito controlado para o processo.
Javier Cobos
Esta é uma resposta impressionante, direi do que os outros fornecidos acima. Todos, por favor, votem.
Jitendra Pawar #
@JavierCobos: se você estava falando dentro de um contêiner ou espaço controlado semelhante, adicione essas informações à própria resposta. Muitas pessoas não estão nesses ambientes, especialmente em uma máquina de desenvolvimento, e isso pode ter consequências indesejadas como estão. Voto negativo, mas feliz em mudar o voto com os devidos esclarecimentos.
Lindes 07/05/19
1
Muitos vão ... mas, como alguém que gasta muito tempo ajudando a treinar desenvolvedores juniores, e mesmo além desse contexto, posso dizer que muitas pessoas fazem uso de respostas no Stack Overflow sem realmente entender o que estão fazendo. .. eles estão apenas enfrentando um problema e veem algo representado como uma solução para o que parece ser o problema deles, e eles correm com ele. Então ... eu pessoalmente desejo que o site dê boas explicações e promova bons hábitos gerais. Então, é daí que venho. Eu sei que não é a única perspectiva, no entanto. :)
lindes
16

Seu aplicativo já está sendo executado nessa porta 8080. Use este código para matar a porta e execute seu código novamente

sudo lsof -t -i tcp:8080 | xargs kill -9
ranjith
fonte
A pergunta faz referência à porta 80, não ao 8080. Além disso, embora isso provavelmente funcione para se livrar de um processo ofensivo na porta 8080, o uso kill -9é quase certamente um exagero e, na minha opinião, um conselho horrível para dar sem avisos específicos sobre isto. Apenas killprovavelmente faria o truque, e realmente, o problema fundamental nesta questão é, eu acho, que eles estão tentando re-executar um servidor de uma e outra vez, de modo que este é apenas um truque, não uma solução. Eles precisam ter uma melhor compreensão do que está acontecendo, o que esta resposta realmente não fornece.
Lindes 07/07/19
15

Outra coisa que pode dar esse erro é dois servidores HTTP no mesmo código do nó. Eu estava atualizando algum código do Express 2 para o Express 3 e tinha isso ...

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});        

// tons of shit.

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});                                                                   

E, desencadeou esse erro.

Evan Carroll
fonte
14

Isso funciona para mim (eu estou usando mac). Execute este comando

lsof -PiTCP -sTCP:LISTEN

Isso exibirá uma lista de portas que seu syetem está usando. Encontre o PIDque seu nó está executando

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node      17269 hientrq   16u  IPv6 0xc42959c6fa30c3b9      0t0  TCP *:51524 (LISTEN)
node      17269 hientrq   19u  IPv4 0xc42959c71ae86fc1      0t0  TCP localhost:1337 (LISTEN)

e corra kill -9 [YOUR_PID]

hientrq
fonte
11

EADDRINUSEsignifica que a porta (que tentamos ouvir no aplicativo do nó) já está sendo usada. Para superar, precisamos identificar qual processo está sendo executado com essa porta.

Por exemplo, se estamos tentando ouvir nosso aplicativo de nó na porta 3000. Precisamos verificar se essa porta já está sendo usada por qualquer outro processo.

passo 1:

$sudo netstat -plunt |grep :3000

Que o comando acima fornece o resultado abaixo.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

passo 2:

Agora você tem o ID do processo (25315), mate esse processo.

kill -9 25315

etapa 3:

npm run start

Nota: Esta solução para usuários Linux.

Thavaprakash Swaminathan
fonte
9
lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393
Pramod Jain
fonte
3
Adicione mais contexto às suas respostas para ajudar futuros leitores a entender o código / comando.
Milo
8

sudo kill $ (sudo lsof -t -i: 80)

por força de matar

sudo kill -9 $ (sudo lsof -t -i: 80)

use o cmd acima para matar uma porta específica e execute o servidor

Marla Tarakeswara Rao
fonte
8

Experimente os dois comandos e ele interromperá todo o processo do nó.

killall 9 node
pkill node
npm start 
Anupam Maurya
fonte
1
esse hack me ajudou, economize muito tempo obrigado
Anoop PS 15/01
5

Este erro ocorre quando você tem algum processo em execução em uma porta na qual deseja executar seu aplicativo.

como obter qual processo em execução nessa porta => comando: sudo netstat -ap | grep: 3000

saída: você obterá as informações do processo que estão usando essa porta

tcp 0 0 Endereço IP: 3000 : LISTEN 26869 / nó

Agora você pode matar esse processo sudo kill -9 26869

WAQAR SHAIKH
fonte
Verificou todas as respostas. Mas você resolve meu problema.
Rahul
5

No comando abaixo, substitua seu portNumber

sudo lsof -t -i tcp:portNumber | xargs kill -9
ramachandrareddy reddam
fonte
5

EADDRINUSE significa que a porta do aplicativo nodejs já está em uso.

  • Agora você matou o processo / aplicativo em execução nessa porta.
  • Encontre o ID do processo do aplicativo:

lsof -i tcp: 3000

  • Agora você obterá a identificação do processo a partir disso.
  • Rode isto:

kill -9 processId

Sidharth Srivastava
fonte
4

Existe uma maneira de finalizar o processo usando o Gerenciador de tarefas:

Observe que esta solução é apenas para Windows

  1. Vá para o Gerenciador de tarefas (ou use o atalho Ctrl+ Shift+ Esc)

  2. Em "Processos em segundo plano", localize os processos "Node.js" e finalize-os (clique com o botão direito do mouse e escolha "Finalizar tarefa")

insira a descrição da imagem aqui

  1. Agora você deve poder começar de novo
Jee Mok
fonte
Para usuários do Mac: 1. Inicie o 'Activity Monitor' 2. Pesquise por 'node' na barra de pesquisa no canto superior direito. 3. Clique duas vezes no processo do nó e saia. Estás pronto!!!! Feliz codificação.
Apogee
3

Eu já vi esse erro antes (no nó) com http.client e, pelo que me lembro, o problema tinha a ver com não inicializar o httpClient ou definir opções incorretas na criação do httpClient e / ou na solicitação de URL.

ControlAltDel
fonte
3

Também tenho o mesmo problema e simplesmente fecho o terminal, abro um novo terminal e corro

node server.js

novamente. isso funciona para mim, é necessário algum tempo para aguardar alguns segundos até que funcione novamente.

Mas isso funciona apenas em uma máquina de desenvolvedor em vez de em um console do servidor.

robinclark007
fonte
3

Erro: ouça EADDRINUSE significa que a porta que você deseja atribuir / ligar ao servidor de aplicativos já está em uso. Você pode atribuir outra porta ao seu aplicativo.

Ou se você deseja atribuir a mesma porta ao aplicativo. Em seguida, mate o aplicativo que está sendo executado na porta desejada.

Para um aplicativo de nó, o que você pode tentar é localizar o ID do processo para o aplicativo de nó:

ps -aux | grep node

Depois de obter a identificação do processo, faça

kill process_id
Parth Vyas
fonte
-ux no windows 10?
precisa
No -aux é para sistemas baseados em Linux. Para sistemas baseados em Windows, você pode procurar o montior do sistema para o processo do nó desejado e finalizá-lo.
Parth Vyas
2

No Debian eu descobri que rodava na porta 80, você precisa emitir o comando como root, ie

sudo node app.js

Espero que ajude

Khurram Ijaz
fonte
2

No meu caso, o Apache HTTP Server foi executado na porta 80, resolvi-o emitindo o comando como root

sudo killall httpd

Atualizar

Se o Jenkin estiver instalado e em execução no seu Mac;

  1. Você pode verificá-lo com sudo lsof -i tcp:8080
  2. Se sim, e você deseja parar o Jenkins apenas uma vez, execute: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Chotala Paresh
fonte
2

Parece que existe outro processo de nó a servir. Verifique digitando isso no seu console (Linux / Mac):

ps aux|grep node

e saia com:

kill -9 <NodeProcessId>

OU uso alternativo

ng serve --port <AnotherFreePortNumber>

para servir seu projeto em um porto livre de sua escolha.

Birol Efe
fonte
1

Ao matar o NODE_PORT, ele pode matar o processo do Chrome ou qualquer coisa que esteja ouvindo a mesma porta, e isso é irritante.

Esse shell script pode ser útil - no meu caso, a porta é 1337, mas você pode alterá-la a qualquer momento

# LOGIC

CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`

for pid in $PORT_PIDS
do

if [[ ${CHROME_PIDS} != *$pid* ]];then

    # NOT FOUND IN CHROME PIDS

    echo "Killing $pid..."
    ps -p "$pid"

    kill -kill "$pid"
    fi

done

sails lift
# OR 'node app' OR whatever that starts your node

exit
Nizar Blond
fonte
1

No meu caso, eu uso hospedagem na web, mas é o mesmo em host local, usei:

ps -aef | grep 'node' 

para assistir ao processo do nó, o console mostra o processo com PID. para matar o processo, você deve usar este comando:

kill -9 PID

onde PID é a identificação do processo do comando acima.

Jorge Mejia
fonte
1

Dois servidores não podem escutar na mesma porta; portanto, verifique se outro servidor está escutando na mesma porta; verifique também a sincronização do navegador se estiver executando na mesma porta.

Falcão
fonte
1

Para outras pessoas no Windows 10 com nó como localhoste executando em uma porta como 3500, não 80 ...

O que não funciona:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

O que mostra informações, mas ainda não funciona:

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

O que funciona:

Git Bash ou PowerShell no Windows

  net -a -o | grep 3500   (whatever port you are looking for) 

Observe o PID (extremo direito) que
eu não consegui killalltrabalhar ... então

  1. Abra seu gerenciador de tarefas
  2. Na guia processos, clique com o botão direito do mouse em Nome ou qualquer coluna e selecione para incluir o PID
  3. Classifique por PID, clique com o botão direito do mouse no PID direito e clique em Finalizar tarefa.

Agora, após esse exercício não tão divertido no Windows, percebi que posso usar o gerenciador de tarefas e encontrar o mecanismo Node e finalizá-lo.

Para sua informação, eu estava usando o Visual Studio Code para executar o Node na porta 3500 e utilizava o shell Git Bash dentro do código VS. Eu saí graciosamente com Ctrl + C, mas às vezes isso não mata. Eu não quero mudar minha porta ou reiniciar, então isso funcionou. Espero que ajude os outros. Caso contrário, é documentação para mim.

Tom Stickel
fonte
1

Para usuários do Windows, execute o seguinte comando na janela do PowerShell para eliminar todos os processos do nó.

Stop-Process -processname node
Rawel
fonte
1

A opção que está funcionando para mim:

Corre:

ps -ax | grep node

Você receberá algo como:

 8078 pts/7    Tl     0:01 node server.js
 8489 pts/10   S+     0:00 grep --color=auto node    
 kill -9 8078
tanque prakash
fonte