Node.js Port 3000 già in uso ma in realtà non lo è?


115

Ho lavorato con un progetto node.js per alcune settimane e ha funzionato alla grande. Di solito, utilizzo la npm startmia app e la visualizzo in un browser su localhost, porta 3000.

Oggi ho iniziato a ricevere il seguente errore durante l'utilizzo di npm start:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

Ho controllato il monitor delle risorse e non ho altri processi in esecuzione sulla porta 3000. Perché dovrei ricevere questo messaggio di errore?

Nel mio app.js ho il seguente codice per impostare la porta ... non è corretto? Prima funzionava bene, quindi non sono sicuro di cosa sto facendo di sbagliato.

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

Grazie per l'aiuto!


MODIFICARE:

Ho provato a eseguire netstat e TCPView per verificare quale processo sta utilizzando la porta, ma non c'è nulla che utilizzi quella porta. Ho anche provato a riavviare il mio laptop ma ricevo ancora lo stesso errore.


C'è un altro processo che utilizza questa porta, è certo. Quale sistema operativo stai provando? Puoi google come 'trova quale prosess usa la porta' per il tuo sistema operativo
tanaydin


1
La favicon verrà memorizzata nella cache. Potresti anche provare netstatin un prompt dei comandi o connetterti a localhost: 3000 con un equivalente telnet, ad esempio PuTTY.
Blorgbeard uscirà il

5
Ho notato che viene visualizzato il messaggio "La porta 3000 è già in uso" dopo "Il server è stato avviato sulla porta 3000": qualcosa nella tua app sta tentando di ricominciare ad ascoltare sulla stessa porta?
Blorgbeard uscirà il

6
La mia ipotesi è che tu abbia due app.listen()dichiarazioni nella tua app su un'altra .listen()che sta anche tentando di avviare un server su quella porta. Il primo funziona, il secondo segnala l'errore. Cerca il tuo codice .listen.
jfriend00

Risposte:


269

Puoi cercare come terminare quel processo.

Per Linux / Mac OS cerca (sudo) runquesto nel terminale:

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

Su Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

cambiare tskillper taskkillin git bash


2
Ho provato una serie di altre soluzioni su Windows, ma questa ha trovato lo strano processo che stava monopolizzando la porta. Ottenuto un voto positivo per aver incluso anche l'approccio Linux oltre a lavorare su Windows.
truedat101

2
tskill non ha funzionato per me su Windows. taskkill / F / PID myPIDhere - this working
snersesyan

2
Non ottengo nulla solo lsofma con sudo lsof ottengo qualcosa, e uccidere quel processo ha risolto questo problema.
user985366

C'è un modo per ottenere dinamicamente il PID per il processo in esecuzione e ucciderlo? Per qualche motivo, devo farlo ogni volta che eseguo il deployment per prod manualmente. Nota a margine, sicuro se questo è correlato al PM2 o ​​meno.
S_W

taskkill non ha funzionato per me su git-bash, ma tskill sì. Grazie.
nickcamillo

34

A volte succede, come ha proposto @sova. A volte capita a me, EADDR in uso. In genere c'è una finestra di terminale nascosta in background che sta ancora eseguendo l'app. E questo è giusto anche per me.

Succede, quando hai aperto il terminale per molto tempo, sì hai ragione, devi interrompere il processo. Ma a volte non si è fermato in secondo piano. Quindi la soluzione migliore è chiudere il terminale e riavviarlo. Risolverà il tuo problema. perché nel mio caso funziona.

Anche,

sudo lsof -i:<PORT_NO>

chiudere l'istanza per il momento attuale ma non è possibile arrestare il processo in background. Quindi per una volta

sudo kill <PID>

funziona, ma ancora una volta quando aggiorniamo il nostro codice e salviamo, questo problema si verifica di nuovo come con Nodemon .

Quindi uscire dal terminale risolverà il problema. O

  killall -9 node

2
Né lsof né netstat hanno restituito nulla, eppure sembrava esserci ancora qualche processo che utilizzava il port. Dopo killall -9 nodeessere stato in grado di eseguire il server in locale.
Julsteri

grazie per il comando killall -9 node. ha funzionato su goorm IDE
ifhy

24

Forse puoi prenderlo come riferimento. Questa singola riga di comando può terminare il processo in esecuzione su una determinata porta.

npx kill-port 3000

inserisci qui la descrizione dell'immagine


Per uccidere più porte.

npx kill-port 3000 8080 4200

22

Per Windows, il Task Manager mostrerebbe sicuramente un processo del nodo in esecuzione. Prova a terminare il processo, risolverà il problema.


22

Ho avuto lo stesso problema. (I passaggi seguenti funzionano bene su Windows 10):

  1. Apri Task Manager (premi Ctrl+ Alt+ Delete)
  2. Seleziona la scheda "Processi"
  3. Cerca "Node.js: JavaScript lato server"
  4. Selezionalo e fai clic sul pulsante "Termina attività"

Adesso puoi correre npm start.

Spero ti aiuti.


7

Ho visto la stessa cosa e ho provato tutti i suggerimenti di cui sopra senza successo. Ecco i passaggi che lo risolvono per me: - disattiva il wifi - avvia npm (dovrebbe funzionare) - attiva il wifi

Non sono esattamente sicuro di quale sia il problema principale, ma questo lo ha risolto per me.


Ho appena avuto questo successo anche a me. netstat -anonon ha elencato nulla utilizzando la porta 3000.
Nathan

Santo cielo, questo ha risolto anche per me dato che ovviamente non c'era nulla in esecuzione sulla porta 3000. Ho iniziato ad avere questo problema dopo un aggiornamento di Windows. Non ho mai pensato di disattivare il WiFi. Grazie per aver risolto il problema :)
3Dos

7

Uccidere un processo che possiede la porta 3000

Per prima cosa, diamo un'occhiata a come possiamo uccidere un processo che ha una porta aperta.

Usando il comando lsof, possiamo recuperare il PID che ha la porta data:

$ lsof -i :3000 -t
12345

Quindi possiamo interrompere questo processo semplicemente facendo:

$ kill 12345

Trasformiamo questo in una frase:

lsof -i 3000 -t | xargs kill

Se stai utilizzando una variabile di ambiente per impostare la porta del server, possiamo specificare che invece di codificare i nostri valori:

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

Infine, possiamo impostare la porta 3000 se la variabile d'ambiente non è impostata:

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

Ottenere nodemon per eseguire gli hook

Nodemon ti consente di impostare hook di eventi tramite il file di configurazione nodemon.json:

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

Ciò farà sì che nodemon esegua il ${PORT:-3000} -t | xargscomando sh -c 'lsof -i: kill ogni volta che la tua app si arresta in modo anomalo , uccidendo così il processo figlio che ha generato che tiene aperta la porta.

oppure puoi provare questo

fuser -k PORT-NO/tcp

per esempio:

fuser -k 3000/tcp

Questa è una soluzione abbastanza carina e pulita per uccidere un processo. Devo cercare ogni volta come farlo, e questa è la soluzione più bella che abbia mai visto!
twknab

Sto riscontrando questo problema anche se nessun processo sta tornando da lsof -i :3000 -t= \
xaunlopez

@xaunlopez prova questo fuser -k port-number/tcp
Afeesudheen

6

Stavo usando il server espresso con nodemon su NodeJS. Ho ricevuto il seguente messaggio e sembra un errore:

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

Esiste una soluzione generale per cui se si terminano tutte le connessioni al server del nodo, è possibile aggiungere questo codice nel file package.json:

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

Inoltre, ho trovato diverse soluzioni di comando di Windows e bash su Win 10 x64.

Tutti i miei appunti sono qui:


# Termina tutte le connessioni al server 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.

# Esempio: aprire il Task Manager di Windows e vedere il numero PID "node.exe" su Windows

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

# Termina un processo in Windows per numero di porta (esempio)

Per un aiuto:

$ taskkill /?
$ tskill /?

Codice 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).

Codice 2:

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

Codice 3:

$ tskill 14228

# Riga di comando per guardare una porta specifica

in cmd:

$ netstat -ano | find "14228"

in bash:

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

# Trova node.exe utilizzando il comando "tasklist"

in cmd:

$ tasklist | find "node"

in 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

A volte mi succede, EADDR in uso. In genere c'è una finestra di terminale nascosta in background che sta ancora eseguendo l'app. Puoi interrompere il processo con ctrl + C nella finestra del terminale.

Oppure, forse stai ascoltando il porto più volte a causa di copy / pasta =)


Grazie per l'aiuto! Non ho altre finestre di terminale aperte, dovrei controllare qualcos'altro?
user2573690

trova qualsiasi nodo o processo npm e terminalo. se hai ancora un funk, riavvia la macchina o scegli semplicemente una porta diversa con cui lavorare. Non c'è davvero alcun motivo per cui debba essere la porta 3000 o 8080
sova

Ho appena creato una nuova app del nodo e l'ho avviata sulla porta 3000 e quella sembra funzionare bene, ma quando provo a eseguire il mio progetto esistente, dice che la porta è in uso. Hai mai avuto questo problema?
user2573690

@ user2573690 non l'ho mai visto prima, ma forse hai più file js (come app.js e index.js) dove uno chiama .listen()più volte?
sova

2
Grazie! Sono riuscito a capirlo, stavo ascoltando il porto più volte, incidente copia / pasta! Se puoi modificare la tua risposta e aggiungere quel pezzo, lo contrassegnerò. Grazie ancora!
user2573690

5

Apri Task Manager (premi Ctrl + Alt + Canc Seleziona la scheda "Processi" Cerca "Node.js: JavaScript lato server" Selezionalo e fai clic sul pulsante "Termina attività"


2

È venuto da Google qui con una soluzione per High Sierra.

Qualcosa è cambiato nella configurazione di rete di macos e alcune app (incluso il ping) non possono risolvere localhost.

La modifica di / etc / hosts sembra una soluzione:

cmd: sudo nano /etc/hosts/ contenuto127.0.0.1 localhost

O semplicemente (se sei sicuro che il tuo / etc / hosts sia vuoto) sudo echo '127.0.0.1 localhost' > /etc/hosts


2

Ho speso 2 ore per scoprire perché EADDRINUSEnon mi permetteva di avviare un'app (altri server node-express erano ok) ... ha iniziato a funzionare dopo l'aggiunta lazyConnect: true, alla configurazione dell'origine dati.

Non chiedermi perché ha aiutato. Non lo so. Metto queste informazioni qui solo per le persone che hanno lo stesso problema.


votato per la disponibilità ad aiutare E una soluzione che può aiutare a trovare la causa principale.
Titou

2

Ho riscontrato questo problema utilizzando Git Bash su Windows. Corro npm start, o node app.js. Dopo averlo terminato brevemente con Ctrl + C e aver tentato di riavviare il server utilizzando npm startonode app.js poi ottengo questo messaggio di errore.

Quando lo faccio con il normale prompt dei comandi di Windows , tuttavia, funziona bene.

Oppure puoi farlo in un altro modo. Apri il Task Manager e trova la riga " Node.js: Server-side JavaScript ". Selezionalo e termina l'attività . Ora dovrebbe funzionare.

Grazie.


2

Se vuoi chiudere solo una porta, esegui questo comando. kill -9 $(lsof -t -i:3000)

La differenza tra pkillekill è che qualcuno lavora l'argilla. In kill applichi un filtro. devi solo fermare il porto che vuoi.

Il pkillcomando chiude tutti i processi del nodo. pkill -9 node

Usa pkill per evitare perdite di memoria che si verificano occasionalmente durante lo sviluppo. se c'è più di un nodo, li uccide tutti.

Anche l'uso di script in package.json è esemplificato.

"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

Prova ad aprire localhost nel tuo browser. Basta digitare: localhost:3000nella barra degli indirizzi.

Se l'app si apre, significa che la tua precedente npm runè ancora attiva. Ora, puoi semplicemente apportare modifiche al codice e vedere gli effetti se stai progettando la stessa app o se vuoi eseguire un'altra app, modifica un po 'il codice (in index.js dell'app in esecuzione in precedenza) e ( probabilmente aggiorna la scheda del browser) per farlo andare in crash;) ..... Ora vai a correrenpm run start nuovo a dalla tua nuova directory dell'app. Spero che questo ti aiuti! :)

o

Puoi aprire il Task Manager (WINDOWS_KEY + X> Task Manager) e vedrai la riga "Node.js: Server-side JavaScript". Selezionalo e termina l'attività .... Dovrebbe funzionare ora !!



In caso contrario, modifica il .envfile della tua app per includere port:3002ed eseguire la nuova app. Ciò ti consentirà di eseguire due app separate su porte diverse. Saluti!!


1

Per gli utenti Windows, basta semplicemente interrompere tutti i processi di Node.js in Task Manager

Spero che possa aiutare


1

Semplice in Linux

  • Apri il tuo terminale
  • Porta libera dai processi -> kill $ (lsof -t -i: $ port)

1

Ho anche riscontrato lo stesso problema. Il modo migliore per risolvere è (per Windows) :

  1. Vai al Task Manager .

  2. Scorri e trova un processo di attività denominato. Node.js: JavaScript lato server Immagine aggiunta per riferimento

  3. Termina questo compito particolare.

Ecco qua! Ora avvia npm e funzionerà come prima!



0

Potrebbe essere un processo di amministrazione in esecuzione in background e netstatnon lo mostra.
Utilizzare tasklist | grep nodeper trovare il PID di questo processo di amministrazione e quindikill PID



0

Negli script package.json inlcude:

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

Credo che il problema fosse per me il tempo in cui la vecchia porta non veniva chiusa in tempo da nodemon per il riavvio. Ho riscontrato il problema utilizzando multer.


Regola il ritardo come richiesto.
Kalkhas

0

i metodi server o app listen () potrebbero essere aggiunti in 2 posizioni. Cerca i metodi listen () nel per l'avvio dell'applicazione, ecco perché il suo ritorno quando il server è stato avviato sulla porta XXXX e la porta XXXX è già in uso, il messaggio viene affiancato


0

Nella mia circostanza avevo appena iniziato a utilizzare VS Code e avevo seguito un tutorial utilizzando Sequelize. Alla fine avevo un file bin / www che conteneva l'ascolto (). Non lo sapevo e stavo eseguendo la mia app eseguendo node app.js, quando non funzionava ho quindi aggiunto il contenuto del server Express con .listen () (che ha funzionato bene).

Ma quando si è iniziato a utilizzare nodemon e VSCode è stato puntato su bin / www e ciò ha richiesto il mio app.js.

Per farla breve, avevo aggiunto .listen () al mio app.js e stavo eseguendo app.js direttamente quando non avrei dovuto aggiungerlo ed eseguire bin / www.


0

In ubuntu prendi prima il processo utilizzando il numero di porta: sudo lsof -i: 3000 quindi usa il comando kill per terminare il processo, ad esempio se il PID del processo è 4493 usa il comando: kill 4493 , per mac o windows trova il comando correlato

inserisci qui la descrizione dell'immagine


0

Ho risolto questo problema perché MongoDB o c'è un'altra app che avevi eseguito prima su questa porta, quindi per risolverlo, interrompi il processo dal task manager o cambia semplicemente il numero della porta da 3000 a qualsiasi altra.


0

È molto semplice. Puoi risolverlo in 2 semplici passaggi.

  1. Controlla le tue variabili d'ambiente se c'è una chiave / voce con il nome "PORT".
  2. Se trovato, elimina quella voce o rinominala in qualcos'altro.

Si scopre che qualche altro programma sta usando quella variabile. Di solito quando avvii react-scripts, cercherà una variabile d'ambiente con quel titolo PORT.


-1

Prima di eseguire nodemon, avviare prima mongod. Non riceverai mai questo errore. :)


-2

verificare la presenza di processi in esecuzione sulla stessa porta immettendo il comando:

sudo ps -ef

Puoi trovare il processo in esecuzione sulla rispettiva porta del nodo, quindi uccidere il nodo per

kill -9 <node id>

Se il problema persiste, elimina tutto il nodo

killall node

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.