ExpressJS: genera un evento di errore non gestito


180

Ho creato l'applicazione expressjs usando i seguenti comandi:

express -e folderName
npm install ejs --save
npm install

Quando eseguo l'applicazione con node app.js:, ho i seguenti errori:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: listen EADDRINUSE
    at errnoException (net.js:884:11)
    at Server._listen2 (net.js:1022:14)
    at listen (net.js:1044:10)
    at Server.listen (net.js:1110:5)
    at Object.<anonymous> (folderName/app.js:33:24)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Come sistemarlo?


30
EADDRINUSE significa che la porta è già in uso. prova a cambiare la porta su cui il server web in app.js ascolta o elimina ciò che sta attualmente utilizzando quella porta se non ti serve.
go-oleg,

Se la porta di chiusura non è fissa, provate questo> stackoverflow.com/a/52441297/6665568
Natesh Bhat

Risposte:


400

Avevi eseguito un altro server utilizzando la stessa porta come 8080.

Forse hai eseguito node appun'altra shell, per favore chiudila ed esegui di nuovo.

È possibile controllare il n. PORT. è disponibile o non in uso

netstat -tulnp | grep <port no>

In alternativa, puoi usare lsof :

lsof -i :<port no>

4
Mi sono imbattuto in questo usando WebStorm. Ho avuto due sessioni di debug aperte nello stesso spazio di lavoro. Doh!
Nick Curran,

53
Un errore così comune merita davvero un messaggio di errore migliore.
Tamlyn,

Questo mi è successo quando ho usato node-activedirectory. Alla mia baseDN mancava il sottodominio. baseDN: 'ldap: // dc = sottodominio, dc = dominio, dc = com'
Segna il

Stava eseguendo un'istanza di rails server...: |
Sheharyar,

1
su mac alta sierra: lsof -nP -i4TCP: $ PORT | grep ASCOLTA
Roee

61

Riceviamo un errore simile quando a volte eseguiamo la nostra app express. Dobbiamo seguire lo stesso in quel caso. Dobbiamo verificare se funziona in qualsiasi terminale. Se vuoi trovare e terminare il processo, segui questi passaggi:

  • ps aux | nodo grep
  • Trova l'ID processo (secondo da sinistra):
  • uccidere -9 PRCOCESS_ID

O

Utilizzare un singolo comando per chiudere tutti i processi del nodo in esecuzione.

ps aux | awk '/node/{print $2}' | xargs kill -9

5
ps aux | grep node | awk '{print $2}' | xargs kill -9
Daniel,

killall -r node(in Linux)
jt3k,

25

Probabilmente un'istanza è ancora in esecuzione. Questo lo risolverà.

killall node

Aggiornamento: questo comando funziona solo su Linux / Ubuntu e Mac.


1
killall -9 nodo
Pankaj Shinde

16

Se sei su Linux, questo problema può verificarsi anche se Nodejs non è in esecuzione come root.

Cambia da questo:

nodejs /path/to/script.js

A questa:

sudo nodejs /path/to/script.js

Mi è appena successo e nessuno degli altri suggerimenti qui risolto. Fortunatamente mi sono ricordato che la sceneggiatura funzionava l'altro giorno quando era in esecuzione come root. Spero che questo aiuti qualcuno!

Dichiarazione di non responsabilità: questa probabilmente non è la soluzione migliore per un ambiente di produzione. L'avvio del servizio come root può introdurre alcune falle nella sicurezza del server / dell'applicazione. Nel mio caso, questa era una soluzione per un servizio locale, ma incoraggerei gli altri a passare un po 'più di tempo a cercare di isolare la causa.


1
Sembra davvero pericoloso eseguire lo script come root per risolvere questo problema. A meno che non si stia tentando di eseguire il binding a una porta inferiore a 1024, non è necessario eseguire il nodo come root. Sospetto nel tuo caso, stai provando a collegarti alla porta 80 o 443. Suggerirei di usare Nginx per indirizzare il traffico da quelle porte a nodejs su una porta più alta, come 8000 o qualcosa del genere.
Varikin,

1
Grazie per la segnalazione. Non credo che il particolare script che stavo usando chiamasse una di quelle porte, non sto certamente usando Node come server http. Forse era uno dei moduli che ho usato che richiedeva autorizzazioni aggiuntive? Mi scuso per un po 'di tempo, quindi non sono nemmeno sicuro di quale script abbia richiesto questa soluzione. Aggiungerò un disclaimer sul tentativo di farlo in un ambiente di produzione.
CauselessEffect

12

Questo perché la porta che si sta utilizzando per eseguire lo script è già in uso. Devi interrompere tutti gli altri nodi che utilizzano quel post. per questo, puoi controllare tutto il nodo da

ps -e

OPPURE solo per il processo nodo utilizzare ps -ef | grep node Questo ti fornirà l'elenco di tutto il processo nodo con ID

per uccidere tutto il processo del nodo

sudo killall -9 node

O per l'id specifico sudo kill -9 id


mi hai salvato la NOTTE!
Mujtaba Mahmood,

8

Ho corretto il bug cambiando la porta che era

app.set('port', process.env.PORT || 3000);<br>

e modificato in:

app.set('port', process.env.PORT || 8080);<br>

1
In cosa differisce dall'applicare ciò che dice la risposta accettata alla risposta data da Mark?
EWit

3

Il nodo porta che si sta tentando di utilizzare può essere già utilizzato da un altro programma. Nel mio caso era ntop , che avevo installato di recente. Ho dovuto aprire http: // localhost: 3000 / in un browser per realizzarlo. Un altro modo per trovare il processo è dato qui .


2

Se si desidera utilizzare lo stesso numero di porta, digitare kill %il terminale, che interrompe il processo in background corrente e libera la porta per un ulteriore utilizzo.


2

questo significa che il tuo file è in esecuzione ora. inserisci il codice qui sotto e riprova:

sudo pkill node

1

Chiudere tutti gli altri server nodo in esecuzione, anche se si trovano in altre finestre del terminale o in esecuzione su porte diverse. Questo dovrebbe risolvere il problema.


1

Se hai provato a uccidere tutte le istanze del nodo e altri servizi in ascolto su 3000 (impostazione predefinita utilizzata dall'impostazione dello scheletro express) senza alcun risultato, dovresti verificare che il tuo ambiente non definisca "porta" come qualcosa di inaspettato. Altrimenti, probabilmente otterrai lo stesso errore. Nel file app.js di express skeleton noterai la riga 15:

app.set('port', process.env.PORT || 3000);

1

Per risolvere questo problema, chiudere o chiudere il server in esecuzione. Se stai utilizzando Eclipse IDE, segui questo,

Esegui> Debug

inserisci qui la descrizione dell'immagine

Fare clic con il tasto destro del mouse sul processo in esecuzione e fare clic su Termina .


1

events.js: 183 throw er; // Evento "errore" non gestito

Ho anche avuto lo stesso tipo di problema e ho provato molti modi, ma alla fine ho ottenuto questo, funziona bene:

npm install ws@3.3.2 --save-dev --save-exact

Fare riferimento a questo link per ulteriori chiarimenti https://github.com/ionic-team/ionic-cli/issues/2922


1

In realtà i tasti Ctrl + C non rilasciano la porta utilizzata dal processo del nodo. Quindi c'è questo errore. La soluzione al problema stava usando il seguente frammento di codice in server.js:

process.on('SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit(1);
});

Questo ha funzionato per me.

Puoi anche verificare le altre soluzioni menzionate all'arresto Graceful in NodeJS


1

Motivo di questo errore

Alcuni altri processi sono già in esecuzione sulla porta specificata

Soluzione semplice e veloce

Su SO Linux, ad esempio hai specificato 3000 come porta

  • Apri il terminale ed esegui lsof -i :3000. Se un processo è già in esecuzione sulla porta 3000, vedrai questa stampa sulla console

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    16615 aegon   13u  IPv6 183768      0t0  TCP *:3000 (LISTEN)

  • Copia il PID (ID processo) dall'output

  • Esegui sudo kill -9 16615(devi inserire PID dopo -9)

  • Riavvia il server

0

Nel mio caso ho dovuto correre anch'io vagrant reload. Anche senza i processi del nodo che eseguivano la mia app express nella mia macchina virtuale, continuavo a ricevere questo errore fino a quando non ho ricaricato la scatola vagabonda.


0

Interrompere il servizio che utilizza quella porta.

sudo service NAMEOFSERVICE stop

0

Nel mio caso il problema è stato causato dimenticando di chiamare next()una chiamata al metodo "use" di expressjs.

Se il middleware corrente non termina il ciclo richiesta-risposta, deve chiamare next () per passare il controllo al middleware successivo, altrimenti la richiesta verrà lasciata in sospeso.

http://expressjs.com/guide/using-middleware.html




0

Dopo aver ucciso lo stesso processo più volte e non essere in grado di individuare cos'altro era in esecuzione sulla porta 8000, mi sono reso conto che stavo cercando di eseguire due volte sulla porta 8000:

Prima:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});
app.listen(port, () => {
  console.log("We are live on " + port);
});

Dopo:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});

0

Ho avuto lo stesso problema e ho scoperto che era ancora in esecuzione un processo nodejs che avevo precedentemente annullato con CTRL + C. Il problema in Windows 10 è che Ctrl + C non uccide con garbo i nodijs. Ho aperto il task manager e ho terminato il processo manualmente. Le soluzioni fornite su GitHub non hanno funzionato per me.


0

Se si utilizza Windows, è possibile terminare il processo da Task Manager per node.js


0

Nessuna delle risposte ha funzionato per me.

Quando ho riavviato il mio computer ho potuto mettere in funzione il server.

Mac
shutdown now -r

Linux
sudo shutdown now -r


0

-> controlla cosa è in esecuzione sulla porta 8080 o qualsiasi cosa tu voglia controllare

lsof -i @localhost:8080

se qualcosa è in esecuzione puoi chiuderlo o usare un comando kill per chiuderlo


0

Semplicemente controlla il tuo teminale in Visual Studio Code Perché stavo eseguendo la mia app di nodo e ibernavo il mio laptop, quindi la mattina successiva riaccendo il mio laptop per lo sviluppo del software. Quindi eseguo di nuovo il comando nodemon app.js Il primo waas è in esecuzione dalla notte e il secondo ha eseguito il mio ultimo comando, quindi due prompt dei comandi stanno ascoltando le stesse porte ed è per questo che stai riscontrando questo problema. Semplice Chiudi un termianl o tutto il terminale, quindi esegui il nodo app.js o nodemon app.js


0

La porta che stai ascoltando è già in ascolto da un altro processo.

Quando ho riscontrato questo errore, ho interrotto il processo usando Windows PowerShell (perché ho usato Windows)

  1. Elenco di voci aperte su Windows PowerShell
  2. genere ps e quindi è possibile ottenere un elenco di processi
  3. trova il processo denominato nodo e nota il ID
  4. tipo Stop-process <Id> Penso che sia di aiuto per gli utenti di Windows

0

Ho riscontrato lo stesso problema oggi e la porta non è stata utilizzata. Il seguente approccio ha aiutato:

rm -rf node_modules && npm cache clean && npm install
npm start

0

Se è in Mac, allora è tutto su IP di x86_64-apple-darwin13.4.0. Se segui errori sarebbe qualcosa legato a x86_64-apple-darwin13.4.0. Inserisci

127.0.0.1 x86_64-apple-darwin13.4.0

nel file / etc / hosts . Quindi il problema è sparito


-1

Basta cambiare la porta, potrebbe essere la tua porta corrente è in uso da IIS o da qualche altro server.


Questo è stato chiesto e risposto 4 anni fa con la stessa ma migliore risposta.
George,
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.