A Porta 3000 do Node.js já está em uso, mas na verdade não está?

114

Tenho trabalhado com um projeto node.js por algumas semanas e tem funcionado muito bem. Normalmente, eu uso npm startpara executar meu aplicativo e visualizá-lo em um navegador no localhost, porta 3000.

Hoje, comecei a receber o seguinte erro ao usar npm start:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

Verifiquei o monitor de recursos e não tenho nenhum outro processo em execução na porta 3000. Por que estou recebendo essa mensagem de erro?

No meu app.js, tenho o seguinte código para definir a porta ... isso está incorreto? Funcionava bem antes, então não tenho certeza do que estou fazendo de errado.

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

Obrigado pela ajuda!


EDITAR:

Tentei executar netstat e TCPView para verificar qual processo está usando a porta, mas não há nada usando essa porta. Eu também tentei reiniciar meu laptop, mas ainda recebo o mesmo erro.

user2573690
fonte
Existe outro processo que usa essa porta, é certo. Qual sistema operacional você está tentando? Você pode pesquisar no Google como 'encontre qual prosess usa a porta' para seu sistema operacional
tanaydin
1
O favicon será armazenado em cache. Você também pode tentar netstatem um prompt de comando ou conectar-se a localhost: 3000 com um equivalente telnet - PuTTY, por exemplo.
Blorgbeard é lançado em
5
Percebo que você recebe "A porta 3000 já está em uso" depois de "Servidor iniciado na porta 3000" - algo em seu aplicativo está tentando começar a escutar novamente na mesma porta?
Blorgbeard é lançado em
6
Meu palpite é que você tem duas app.listen()instruções em seu aplicativo em outro .listen()que também está tentando iniciar um servidor nessa porta. O primeiro funciona, o segundo relata o erro. Pesquise seu código por .listen.
jfriend00

Respostas:

269

Você pode pesquisar sobre como matar esse processo.

Para Linux / Mac OS, pesquise (sudo) runno terminal:

$ lsof -i tcp:3000
$ kill -9 PID

No Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

mudança tskillpara taskkillno git bash

Animesh Singh
fonte
2
Já tentei várias outras soluções no Windows, mas esta encontrou o processo estranho que estava monopolizando a porta. Ganhou um upvote por incluir também a abordagem do Linux, além de trabalhar no Windows.
veredat101
2
tskill não funcionou para mim no Windows. taskkill / F / PID myPIDhere - esta funcionando
snersesyan
2
Eu não ganho nada apenas, lsofmas com sudo lsof eu recebo algo, e matar aquele processo resolveu o problema.
user985366
Existe uma maneira de obter dinamicamente o PID para o processo em execução e eliminá-lo? Por algum motivo, preciso fazer isso toda vez que implantar o prod manualmente. Nota lateral, certifique-se se isso está relacionado ao PM2 ou não.
S_W
taskkill não funcionou para mim no git-bash, mas tskill sim. obrigado.
nickcamillo
34

Às vezes acontece, como propôs @sova. Isso às vezes acontece comigo, EADDR em uso. Normalmente, há uma janela de terminal escondida no fundo que ainda está executando o aplicativo. E isso também está certo para mim.

Acontece, quando você abre o terminal há muito tempo, sim, você tem razão, você tem que parar o processo. Mas às vezes não parava em segundo plano. Portanto, a melhor solução é fechar o terminal e reiniciá-lo. Isso resolverá seu problema. porque no meu caso funciona.

Além disso,

sudo lsof -i:<PORT_NO>

feche a instância para o tempo presente, mas não é possível interromper o processo em segundo plano. Então, por uma vez,

sudo kill <PID>

funciona, mas novamente quando atualizamos nosso código e salvamos, esse problema ocorre novamente como com Nodemon .

Portanto, saia do terminal resolverá o problema. OU

  killall -9 node
Techyaura
fonte
2
Nem o lsof nem o netstat retornaram nada, mas ainda parecia haver algum processo usando a porta. Depois de killall -9 nodeconseguir rodar o servidor localmente.
Julsteri
obrigado pelo comando killall -9 node. funcionou no IDE
goorm
24

Talvez você possa tomar isso como referência. Esta única linha de comando pode eliminar o processo em execução em determinada porta.

npx kill-port 3000

insira a descrição da imagem aqui


Para matar várias portas.

npx kill-port 3000 8080 4200
Penny Liu
fonte
22

Para janelas, o Gerenciador de Tarefas definitivamente mostraria um processo de nó em execução. Tente matar o processo, isso resolverá o problema.

PRAKASH THOMAS VARGHESE
fonte
22

Eu tive o mesmo problema. (As etapas abaixo funcionam bem no Windows 10):

  1. Abra o gerenciador de tarefas (pressione Ctrl+ Alt+ Delete)
  2. Selecione a 'guia Processos'
  3. Pesquise por 'Node.js: JavaScript do lado do servidor'
  4. Selecione-o e clique no botão 'Finalizar tarefa'

Agora você pode correr npm start.

Espero que ajude você.

Mahyar
fonte
7

Eu vi a mesma coisa e tentei todas as sugestões acima sem sucesso. Aqui estão as etapas que resolvem isso para mim: - desligar wi-fi - iniciar npm (isso deve funcionar) - ativar wi-fi

Não tenho certeza de qual é o problema raiz, mas isso o resolveu para mim.

James Smith
fonte
Eu simplesmente fiz isso acontecer comigo também. netstat -anonão listou nada usando a porta 3000.
Nathan,
Puta merda, isso também resolveu para mim, pois obviamente nada estava rodando na porta 3000. Comecei a ter esse problema depois de uma atualização do Windows. Nunca pensei em desligar o WiFi. Obrigado por resolver isso :)
3Dos
7

Matando um processo que possui a porta 3000

Primeiro, vamos dar uma olhada em como podemos eliminar um processo que tem uma porta aberta.

Usando o comando lsof, podemos recuperar o PID que tem a porta fornecida:

$ lsof -i :3000 -t
12345

Então, podemos eliminar esse processo apenas fazendo:

$ kill 12345

Vamos transformar isso em uma linha:

lsof -i 3000 -t | xargs kill

Se você estiver usando uma variável de ambiente para definir a porta do servidor, podemos especificar isso em vez de codificar nossos valores:

lsof -i ${PORT} -t | xargs kill

Por último, podemos usar como padrão a porta 3000 se a variável de ambiente não estiver definida:

lsof -i ${PORT:-3000} -t | xargs kill

Fazendo o nodemon executar ganchos

O Nodemon permite configurar ganchos de eventos por meio do arquivo de configuração nodemon.json:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

Isso fará com que o nodemon execute o ${PORT:-3000} -t | xargscomando sh -c 'lsof -i: kill sempre que seu aplicativo travar, matando assim o processo filho que ele gerou que mantém a porta aberta.

ou você pode tentar este

fuser -k PORT-NO/tcp

por exemplo:

fuser -k 3000/tcp
Afeesudheen
fonte
Esta é uma solução muito boa e limpa para matar um processo. Tenho que ver como fazer isso todas as vezes, e essa é a solução mais legal que já vi!
twknab
Estou tendo esse problema, embora nenhum processo esteja retornando de lsof -i :3000 -t= \
xaunlopez
@xaunlopez tente este aqui fuser -k port-number/tcp
Afeesudheen
6

Eu estava usando o servidor expresso com nodemon no NodeJS. Recebi a seguinte mensagem e parece um erro:

$ node ./bin/www
Port 3000 is already in use

Existe uma solução geral que se você encerrar todas as conexões do servidor de nó, você pode adicionar este código em seu arquivo package.json:

"scripts": {
    "start": "node ./bin/www",
    "stop": "taskkill -f -im node.exe"
},

Além disso, encontrei várias soluções de comando e bash do Windows no Win 10 x64.

Todas as minhas notas estão aqui:


# Encerrar todas as conexões de servidor NodeJS

$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.

# Exemplo: Abra o Gerenciador de Tarefas do Windows e veja o número PID "node.exe" no Windows

>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano

# Mate um processo no Windows pelo número da porta (exemplo)

Para ajuda:

$ taskkill /?
$ tskill /?

Código 1:

$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

Código 2:

$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.

Código 3:

$ tskill 14228

# Linha de comando para procurar uma porta específica

em cmd:

$ netstat -ano | find "14228"

em bash:

$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228

# Encontre node.exe usando o comando "tasklist"

em cmd:

$ tasklist | find "node"

em bash:

$ tasklist | grep node
$ tasklist | grep node.exe
node.exe                     14228 Console                    2     48,156 K
node.exe                     15236 Console                    2     24,776 K
node.exe                     19364 Console                    2     24,428 K
Aygunyilmaz
fonte
5

Isso acontece comigo às vezes, EADDR em uso. Normalmente, há uma janela de terminal escondida no fundo que ainda está executando o aplicativo. Você pode parar o processo com ctrl + C na janela do terminal.

Ou talvez você esteja ouvindo a porta várias vezes devido a copy / pasta =)

sova
fonte
Obrigado pela ajuda! Não tenho nenhuma outra janela de terminal aberta. Mais alguma coisa que devo verificar?
user2573690
encontre qualquer nó ou processo npm e finalize-o. se ainda assim você tiver um problema, reinicie a máquina ou apenas escolha uma porta diferente para trabalhar. Não há realmente nenhuma razão para ser a porta 3000 ou 8080
sova
Acabei de criar um novo aplicativo de nó e iniciá-lo na porta 3000 e esse parece funcionar bem, mas quando tento executar meu projeto existente, ele diz que a porta está em uso. Você já teve esse problema?
user2573690
@ user2573690 Não encontrei isso antes, mas talvez você tenha vários arquivos js (como um app.js e um index.js) onde um está chamando .listen()várias vezes?
sova
2
Obrigado! Eu consegui descobrir, eu estava ouvindo a porta várias vezes, acidente de cópia / massa! Se você puder editar sua resposta e adicionar essa parte, irei marcá-la. Mais uma vez obrigado!
user2573690
5

Abra o Gerenciador de Tarefas (pressione Ctrl + Alt + Del Selecione a 'Aba Processos' Procure por 'Node.js: JavaScript do lado do servidor' Selecione-o e clique no botão 'Finalizar tarefa'

Omar Bakhsh
fonte
2

Vim do Google aqui com uma solução para High Sierra.

Algo mudou na configuração de rede de macos e alguns aplicativos (incluindo ping) não podem resolver o localhost.

Editar / etc / hosts parece uma solução:

cmd: sudo nano /etc/hosts/ conteúdo127.0.0.1 localhost

Ou simplesmente (se você tiver certeza de que seu / etc / hosts está vazio) sudo echo '127.0.0.1 localhost' > /etc/hosts

Sznowicki
fonte
2

Passei 2h descobrindo por que EADDRINUSEnão estava me permitindo iniciar um aplicativo (outros servidores Node-Express estavam ok) ... começou a funcionar após adicionar lazyConnect: true, a configuração da fonte de dados.

Não me pergunte por que ajudou. Eu não sei. Estou colocando essas informações aqui apenas para pessoas com o mesmo problema.

teste 30
fonte
voto positivo pela disposição de ajudar E uma solução que pode ajudar a encontrar a causa raiz.
Titou
2

Eu tenho esse problema usando Git Bash no Windows. Eu corro npm start, ou node app.js. Depois de encerrá-lo com Ctrl + C em breve e tentar iniciar o servidor novamente usando npm startou node app.jsentão recebo esta mensagem de erro.

Quando faço isso com o prompt de comando normal do Windows , no entanto, funciona bem.

Ou você pode fazer isso de outra maneira. Abra o Gerenciador de tarefas e encontre a linha " Node.js: JavaScript do lado do servidor ". Selecione isso e termine a tarefa . Deve funcionar agora.

Obrigado.

Amanullah Aman
fonte
2

Se você deseja fechar apenas uma porta, basta executar este comando. kill -9 $(lsof -t -i:3000)

A diferença entre pkille killé alguém processar argila. No kill você aplica um filtro. basta parar a porta que deseja.

O pkillcomando fecha todos os processos do nó. pkill -9 node

Use pkill para evitar vazamentos de memória que ocorrem ocasionalmente durante o desenvolvimento. se houver mais de um nó, ele mata todos eles.

O uso de scripts em package.json também é exemplificado.

"scripts": {
    "server:start": "cd server && yarn start",
    "server:restart": "cd server && yarn restart",
    "frontend:start": "cd frontend && yarn start",
    "frontend:restart": "kill -9 $(lsof -t -i:4200) && yarn start:frontend"
},
"scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts",
    "restart": "pkill -9 node && start",
    "kill": "pkill -9 node"
},
umutyerebakmaz
fonte
1

Tente abrir o host local em seu navegador. Basta digitar: localhost:3000na barra de endereço.

Se o aplicativo abrir, significa que o anterior npm runainda está ativo. Agora, você pode apenas fazer alterações no código e ver os efeitos se estiver projetando o mesmo aplicativo ou se quiser executar outro aplicativo, basta ajustar o código (em index.js do aplicativo em execução anterior) um pouco e ( provavelmente atualize a guia do navegador) para fazê-lo travar;) ..... Agora vá executarnpm run start novamente a partir do novo diretório do aplicativo. Espero que isto ajude! :)

ou

Você pode abrir o Gerenciador de tarefas (WINDOWS_KEY + X> Gerenciador de tarefas) e verá a linha "Node.js: JavaScript do lado do servidor". Selecione isso e finalize a tarefa .... Deve funcionar agora !!



Caso contrário, altere o .envarquivo do seu aplicativo para incluir port:3002e executar o novo aplicativo. Isso permitirá que você execute dois aplicativos separados em portas diferentes. Felicidades!!

Mohit Singh
fonte
1

Para o usuário do Windows, basta parar todos os processos de Node.js no Gerenciador de Tarefas

Espero que ajude

Muhammad Ashfaq
fonte
1

Simples em linux

  • Abra seu terminal
  • Porta livre de processos -> kill $ (lsof -t -i: $ port)
Oben Desmond
fonte
1

Eu também encontrei o mesmo problema. A melhor maneira de resolver é (para Windows) :

  1. Vá para o Gerenciador de Tarefas .

  2. Role e encontre um processo de tarefa chamado. Node.js: JavaScript do lado do servidor Imagem adicionada para referência

  3. Termine esta tarefa em particular.

Ai está! Agora faça o npm start e funcionará como antes!

Daim_Nickel_Penny
fonte
0

Para usuários do Windows, você pode usar a ferramenta CurrPorts para eliminar portas em uso facilmente

insira a descrição da imagem aqui

Zuhair Taha
fonte
0

Pode ser um processo administrativo em execução em segundo plano e netstatnão mostra isso.
Use tasklist | grep nodepara encontrar o PID deste processo administrativo e entãokill PID

tnoel999888
fonte
0

se você estiver usando o webstorm, certifique-se de que sua porta padrão não seja 3000 em arquivo -> configurações -> Compilar, Execução, Implementação -> Depurador E aí mudar

Porta de servidor integrada

e defina-o como "63342" ou veja esta resposta Alterar porta WebStorm LiveEdit (63342)

Muhammad Saleh
fonte
0

Nos scripts package.json incluem:

"start": "nodemon app.js --delay 1500ms"

Acredito que o problema para mim era o tempo que a porta antiga não estava fechando a tempo pelo nodemon para reiniciar. Eu experimentei o problema ao usar o multer.

Kalkhas
fonte
Ajuste o atraso conforme necessário.
Kalkhas
0

Os métodos do servidor ou do app listen () podem ser adicionados em 2 lugares. Pesquise os métodos listen () no para as inicializações do aplicativo, por isso seu retorno como servidor iniciado na porta XXXX e a porta XXXX já em uso mensagem que vem lado a lado

Anoop George
fonte
0

Na minha situação, eu tinha acabado de começar a usar o VS Code e seguido um tutorial usando o Sequelize. No final, eu tinha um arquivo bin / www que continha o listen (). Eu não sabia sobre isso e estava executando meu aplicativo executando node app.js, quando não funcionou, adicionei ao servidor expresso coisas com .listen () (que funcionou bem).

Mas ao começar a usar o nodemon e o VSCode, ele foi apontado para bin / www e isso exigiu meu app.js.

Para encurtar a história, adicionei .listen () ao meu app.js e estava executando o app.js diretamente quando não deveria ter adicionado isso e executar bin / www.

Peter
fonte
0

No ubuntu, primeiro pegue o processo usando o número da porta: sudo lsof -i: 3000 então use o comando kill para encerrar o processo, por exemplo, se o PID do processo for 4493, use o comando: kill 4493 , para mac ou windows encontre o comando relacionado

insira a descrição da imagem aqui

senhor
fonte
0

Resolvi esse problema porque o MongoDB ou existe outro app que vc já executou antes nesta porta, então para resolver mate o processo do gerenciador de tarefas, ou apenas mude o número da porta de 3000 para qualquer outra.

Omar Abusabha
fonte
0

É muito simples. Você pode corrigi-lo em 2 etapas fáceis.

  1. Verifique suas variáveis ​​de ambiente se houver uma chave / entrada com o nome "PORT".
  2. Se encontrado, exclua essa entrada ou renomeie-a para outra coisa.

Acontece que algum outro programa está usando essa variável. Normalmente, quando você inicia os react-scripts, ele procura uma variável de ambiente com esse título PORT.

Amini-Philips Ogelenye
fonte
-1

Antes de executar o nodemon, inicie o mongod primeiro. Você nunca obterá esse erro. :)

Pratiksha
fonte
-2

verifique se há algum processo em execução na mesma porta digitando o comando:

sudo ps -ef

Você pode encontrar o processo em execução na porta do respectivo nó e, em seguida, eliminar o nó

kill -9 <node id>

Se o problema persistir, basta matar todos os nós

killall node
Mahaveer
fonte
-3

Mata todas as portas em execução (mac):

killall node
Ryan Dhungel
fonte