ExpressJS - throw er Nicht behandeltes Fehlerereignis


180

Ich habe die expressjs-Anwendung mit den folgenden Befehlen erstellt:

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

Wenn ich die Anwendung mit: ausführe, node app.jstreten folgende Fehler auf:

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)

Wie man es repariert?


30
EADDRINUSE bedeutet, dass der Port bereits verwendet wird. Versuchen Sie zu ändern, welchen Port der Webserver in app.js abhört, oder beenden Sie alles, was diesen Port derzeit verwendet, wenn Sie ihn nicht benötigen.
go-oleg

Wenn das Schließen des Ports nicht behoben werden kann
Natesh bhat

Antworten:


400

Sie haben einen anderen Server ausgeführt, der denselben Port wie 8080 verwendet.

Vielleicht warst du node appin einer anderen Shell gelaufen. Bitte schließe sie und renne erneut.

Sie können die PORT-Nr. ist verfügbar oder nicht verwendet

netstat -tulnp | grep <port no>

Alternativ können Sie lsof verwenden :

lsof -i :<port no>

4
Ich bin mit WebStorm darauf gestoßen. Ich hatte zwei Debug-Sitzungen im selben Arbeitsbereich geöffnet. Doh!
Nick Curran

53
Ein solcher häufiger Fehler verdient wirklich eine bessere Fehlermeldung.
Tamlyn

Dies ist mir bei der Verwendung von Node-Activedirectory passiert. Meinem baseDN fehlte die Subdomain. baseDN: 'ldap: // dc = Sub - Domain, dc = domain, dc = com'
Mark

Lief eine Instanz von rails server...: |
Sheharyar

1
auf mac high sierra: lsof -nP -i4TCP: $ PORT | grep HÖREN
Roee

60

Wir erhalten ähnliche Fehler, wenn wir manchmal unsere Express-App ausführen. In diesem Fall müssen wir dasselbe befolgen. Wir müssen überprüfen, ob es in einem Terminal läuft. Wenn Sie den Prozess suchen und beenden möchten, gehen Sie folgendermaßen vor:

  • ps aux | grep node
  • Suchen Sie die Prozess-ID (zweite von links):
  • töte -9 PRCOCESS_ID

ODER

Verwenden Sie einen einzelnen Befehl, um alle laufenden Knotenprozesse zu schließen.

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

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

killall -r node(unter Linux)
jt3k

25

Eine Instanz wird wahrscheinlich noch ausgeführt. Dies wird es beheben.

killall node

Update: Dieser Befehl funktioniert nur unter Linux / Ubuntu & Mac.


1
killall -9 Knoten
Pankaj Shinde

16

Wenn Sie unter Linux arbeiten, kann dieses Problem auch auftreten, wenn Nodejs nicht als Root ausgeführt wird.

Änderung von diesem:

nodejs /path/to/script.js

Dazu:

sudo nodejs /path/to/script.js

Ist mir gerade passiert und keiner der anderen Vorschläge hier hat es behoben. Zum Glück erinnerte ich mich, dass das Skript neulich als Root lief. Hoffe das hilft jemandem!

Haftungsausschluss: Dies ist wahrscheinlich nicht die beste Lösung für eine Produktionsumgebung. Wenn Sie Ihren Dienst als Root starten, kann dies zu Sicherheitslücken in Ihrem Server / Ihrer Anwendung führen. In meinem Fall war dies eine Lösung für einen lokalen Dienst, aber ich würde andere dazu ermutigen, mehr Zeit damit zu verbringen, die Ursache zu isolieren.


1
Klingt sehr gefährlich, wenn Sie das Skript nur als Root ausführen, um dieses Problem zu beheben. Sofern Sie nicht versuchen, eine Verbindung zu einem Port unter 1024 herzustellen, sollten Sie den Knoten niemals als Root ausführen müssen. Ich vermute in Ihrem Fall, dass Sie versuchen, eine Verbindung zu Port 80 oder 443 herzustellen. Ich würde vorschlagen, Nginx zu verwenden, um den Datenverkehr von diesen Ports zu NodeJs an einem höheren Port wie 8000 oder so zu leiten.
Varikin

1
Vielen Dank für den Hinweis. Ich glaube nicht, dass das spezielle Skript, das ich verwendet habe, für einen dieser Ports aufgerufen wurde. Ich verwende Node mit Sicherheit nicht als http-Server. Vielleicht war es eines der Module, die ich verwendet habe und die zusätzliche Berechtigungen erforderten? Ich entschuldige mich für eine Weile und bin mir nicht einmal sicher, welches Skript diese Lösung benötigt. Ich werde einen Haftungsausschluss hinzufügen, um dies in einer Produktionsumgebung zu versuchen.
CauselessEffect

12

Dies liegt daran, dass der Port, den Sie zum Ausführen des Skripts verwenden, bereits verwendet wird. Sie müssen alle anderen Knoten stoppen, die diesen Beitrag verwenden. Dazu können Sie alle Knoten überprüfen

ps -e

ODER nur für Knotenprozess verwenden ps -ef | grep node Hiermit erhalten Sie die Liste aller Knotenprozesse mit ID

um alle Knotenprozesse zu beenden

sudo killall -9 node

Oder für die spezifische ID sudo kill -9 id


Du hast meine NACHT gerettet!
Mujtaba Mahmood

8

Ich habe den Fehler behoben, indem ich den Port geändert habe

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

und geändert zu:

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

1
Wie unterscheidet sich dies von der Anwendung der akzeptierten Antwort auf die Antwort von Mark?
EWit

3

Der Portknoten, den er zu verwenden versucht, kann bereits von einem anderen Programm verwendet werden. In meinem Fall war es ntop , das ich kürzlich installiert hatte. Ich musste http: // localhost: 3000 / in einem Browser öffnen , um es zu realisieren. Eine andere Möglichkeit, den Prozess zu finden, finden Sie hier .


2

Wenn Sie dieselbe Portnummer verwenden möchten, geben Sie kill %das Terminal ein, wodurch der aktuelle Hintergrundprozess abgebrochen und der Port für die weitere Verwendung freigegeben wird.


2

Dies bedeutet, dass Ihre Datei jetzt ausgeführt wird. Geben Sie einfach den folgenden Code ein und versuchen Sie es erneut:

sudo pkill node

1

Schließen Sie alle anderen Knotenserver, die ausgeführt werden, auch wenn sie sich in anderen Terminalfenstern befinden oder an anderen Ports ausgeführt werden. Das sollte das Problem beheben.


1

Wenn Sie versucht haben, alle Knoteninstanzen und andere Dienste, die 3000 abhören (die Standardeinstellung, die vom Express-Skeleton-Setup verwendet wird), ohne Erfolg zu beenden, sollten Sie überprüfen, ob Ihre Umgebung "Port" nicht als etwas Unerwartetes definiert. Andernfalls wird wahrscheinlich der gleiche Fehler angezeigt. In der app.js-Datei des Express-Skeletts werden Sie Zeile 15 bemerken:

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

1

Um dies zu beheben, beenden oder schließen Sie den Server, den Sie ausführen. Wenn Sie die Eclipse-IDE verwenden, befolgen Sie diese Anweisungen.

Ausführen> Debuggen

Geben Sie hier die Bildbeschreibung ein

Klicken Sie mit der rechten Maustaste auf den laufenden Prozess und klicken Sie auf Beenden .


1

events.js: 183 throw er; // Nicht behandeltes 'Fehler'-Ereignis

Ich habe auch die gleiche Art von Problem und viele Möglichkeiten ausprobiert, aber schließlich habe ich das verstanden, das funktioniert gut:

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

Weitere Informationen finden Sie unter diesem Link unter https://github.com/ionic-team/ionic-cli/issues/2922


1

Tatsächlich geben Strg + C-Tasten den vom Knotenprozess verwendeten Port nicht frei. Es gibt also diesen Fehler. Die Lösung des Problems bestand darin, das folgende Codefragment in server.js zu verwenden:

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

Das hat bei mir funktioniert.

Sie können auch nach anderen Lösungen suchen, die unter Graceful Shutdown in NodeJS erwähnt wurden


1

Grund für diesen Fehler

Auf dem von Ihnen angegebenen Port wird bereits ein anderer Prozess ausgeführt

Einfache und schnelle Lösung

Unter Linux haben Sie beispielsweise 3000 als Port angegeben

  • Öffnen Sie das Terminal und führen Sie es aus lsof -i :3000. Wenn auf Port 3000 bereits ein Prozess ausgeführt wird, wird dieser Druck auf der Konsole angezeigt

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

  • Kopieren Sie die PID (Prozess-ID) vom Ausgang

  • Ausführen sudo kill -9 16615(Sie müssen die PID nach -9 setzen)

  • Starten Sie den Server erneut

0

In meinem Fall musste ich auch rennen vagrant reload. Selbst wenn keine Knotenprozesse meine Express-App in meiner virtuellen Maschine ausführen, wurde dieser Fehler immer noch angezeigt, bis die Vagrant-Box neu geladen wurde.


0

Beenden Sie den Dienst, der diesen Port verwendet.

sudo service NAMEOFSERVICE stop

0

In meinem Fall wurde das Problem dadurch verursacht, dass vergessen wurde, next()einen Expressjs-Use-Methodenaufruf aufzurufen.

Wenn die aktuelle Middleware den Anforderungs-Antwort-Zyklus nicht beendet, muss sie next () aufrufen, um die Steuerung an die nächste Middleware zu übergeben. Andernfalls bleibt die Anforderung hängen.

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




0

Nachdem ich denselben Prozess mehrmals abgebrochen hatte und nicht feststellen konnte, was noch auf Port 8000 ausgeführt wurde, stellte ich fest, dass ich zweimal versuchte, auf Port 8000 ausgeführt zu werden:

Vor:

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);
});

Nach dem:

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

Ich hatte das gleiche Problem und stellte fest, dass ein NodeJS-Prozess, den ich zuvor mit STRG + C abgebrochen hatte, noch ausgeführt wurde. Das Problem in Windows 10 ist, dass Strg + C Nodejs nicht ordnungsgemäß tötet. Ich habe den Task-Manager geöffnet und den Prozess manuell abgebrochen. Die auf GitHub bereitgestellten Lösungen haben bei mir nicht funktioniert.


0

Wenn Sie Windows verwenden, können Sie den Prozess über den Task-Manager für node.js beenden


0

Keine der Antworten hat bei mir funktioniert.

Wenn ich meinen Computer neu startete, konnte ich den Server zum Laufen bringen.

Mac
shutdown now -r

Linux
sudo shutdown now -r


0

-> Überprüfen Sie, was auf Port 8080 ausgeführt wird oder welchen Port Sie überprüfen möchten

lsof -i @localhost:8080

Wenn etwas läuft, können Sie es schließen oder mit einem Kill-Befehl schließen


0

Überprüfen Sie einfach Ihr Teminal in Visual Studio Code. Da ich meine Knoten-App ausgeführt habe und meinen Laptop in den Ruhezustand versetze, schalte ich meinen Laptop am nächsten Morgen wieder ein, um Software zu entwickeln. DANN führe ich den erneuten Befehl nodemon app.js aus. Der erste wurde abends ausgeführt und der zweite führte meinen letzten Befehl aus, sodass zwei Befehlsansagen dieselben Ports abhören. Deshalb tritt dieses Problem auf. Einfach Schließen Sie ein Termianl oder alle Terminals und führen Sie dann Ihren Knoten app.js oder nodemon app.js aus


0

Der Port, den Sie abhören, wird bereits von einem anderen Prozess abgehört.

Als ich auf diesen Fehler stieß, habe ich den Prozess mit Windows PowerShell abgebrochen (weil ich Windows verwendet habe).

  1. Listenelement Öffnen Sie die Windows-PowerShell
  2. Geben Sie ein psund erhalten Sie eine Liste der Prozesse
  3. Suchen Sie den Prozess mit dem Namen node und notieren Sie den ID
  4. Typ Stop-process <Id> Ich denke, dass es Hilfe für Windows-Benutzer ist

0

Ich bin heute auf dasselbe Problem gestoßen und der Port wurde nicht verwendet. Der folgende Ansatz hat geholfen:

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

0

WENN es in Mac ist, dreht sich alles um die IP von x86_64-apple-darwin13.4.0. Wenn Sie Fehlern folgen, hängt dies mit x86_64-apple-darwin13.4.0 zusammen. Hinzufügen

127.0.0.1 x86_64-apple-darwin13.4.0

in die Datei / etc / hosts . Dann ist das Problem weg


-1

Ändern Sie einfach Ihren Port. Möglicherweise wird Ihr aktueller Port von iis oder einem anderen Server verwendet.


Dies wurde vor 4 Jahren mit der gleichen, aber besseren Antwort gefragt und beantwortet.
George
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.