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.


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


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

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

22

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


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ê.


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.


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

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

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 =)


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'


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


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.


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.


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"
},

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!!


1

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

Espero que ajude


1

Simples em linux

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

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!



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


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)


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.


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


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.


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


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.


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.


-1

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


-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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.