Node.js Port 3000 wird bereits verwendet, ist es aber nicht?


114

Ich arbeite seit einigen Wochen mit einem node.js-Projekt und es hat großartig funktioniert. Normalerweise verwende ich npm startmeine App, um sie in einem Browser auf localhost, Port 3000, anzuzeigen und anzuzeigen.

Heute habe ich bei der Verwendung von npm start den folgenden Fehler erhalten:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

Ich habe den Ressourcenmonitor überprüft und auf Port 3000 wird kein anderer Prozess ausgeführt. Warum wird diese Fehlermeldung angezeigt?

In meiner app.js habe ich den folgenden Code, um den Port festzulegen ... ist das falsch? Es hat vorher gut funktioniert, also bin ich mir nicht sicher, was ich falsch mache.

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

Danke für die Hilfe!


BEARBEITEN:

Ich habe versucht, netstat und TCPView auszuführen, um zu überprüfen, welcher Prozess den Port verwendet, aber dieser Port wird nicht verwendet. Ich habe auch versucht, meinen Laptop neu zu starten, aber ich erhalte immer noch den gleichen Fehler.


Es gibt einen anderen Prozess, der diesen Port verwendet, das ist sicher. Welches Betriebssystem versuchst du? Sie können es googeln wie "Finden Sie, welcher Prosess Port verwendet" für Ihr Betriebssystem
Tanaydin


1
Das Favicon wird zwischengespeichert. Sie können es auch netstatüber eine Eingabeaufforderung versuchen oder eine Verbindung zu localhost: 3000 mit einem Telnet-Äquivalent herstellen - beispielsweise PuTTY.
Blorgbeard ist

5
Ich stelle fest, dass nach "Server auf Port 3000 gestartet" "Port 3000 wird bereits verwendet" angezeigt wird. Versucht etwas in Ihrer App, denselben Port erneut abzuhören?
Blorgbeard ist

6
Ich vermute, dass Sie zwei app.listen()Anweisungen in Ihrer App auf einer anderen haben .listen(), die ebenfalls versucht, einen Server auf diesem Port zu starten. Der erste funktioniert, der zweite meldet den Fehler. Suchen Sie Ihren Code nach .listen.
jfriend00

Antworten:


266

Sie können suchen, wie Sie diesen Prozess beenden können.

Für Linux / Mac OS suchen Sie (sudo) rundies im Terminal:

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

Unter Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

ändern tskillfür taskkillin git bash


2
Ich habe eine Reihe anderer Lösungen unter Windows ausprobiert, aber diese fand den seltsamen Prozess, der den Port belastete. Erhielt eine positive Bewertung für die Einbeziehung des Linux-Ansatzes zusätzlich zur Arbeit an Windows.
truedat101

2
tskill hat bei Windows nicht für mich gearbeitet. taskkill / F / PID myPIDhere - diese Arbeit
snersesyan

2
Ich bekomme nichts nur mit, lsofaber sudo lsof ich bekomme etwas, und das Beenden dieses Prozesses löste dieses Problem.
user985366

Gibt es eine Möglichkeit, die PID für den laufenden Prozess dynamisch abzurufen und zu beenden? Aus irgendeinem Grund muss ich dies jedes Mal tun, wenn ich ein manuelles Prod bereitstelle. Randnotiz, sicher, ob dies mit PM2 zusammenhängt oder nicht.
S_W

taskkill hat bei git-bash nicht für mich funktioniert, tskill jedoch. Vielen Dank.
Nickcamillo

34

Manchmal passiert es, wie @sova vorgeschlagen hat. Dies passiert mir manchmal, wenn EADDR verwendet wird. Normalerweise versteckt sich im Hintergrund ein Terminalfenster, in dem die App noch ausgeführt wird. Und das stimmt auch mit mir.

Es passiert, wenn Sie das Terminal für lange Zeit geöffnet haben, ja, Sie haben Recht, Sie haben den Prozess gestoppt. Aber manchmal hörte es nicht im Hintergrund auf. Die beste Lösung ist also, dass Sie das Terminal schließen und erneut starten. Es wird Ihr Problem lösen. weil es in meinem Fall funktioniert.

Ebenfalls,

sudo lsof -i:<PORT_NO>

Schließen Sie die Instanz für die aktuelle Zeit, können Sie den Vorgang jedoch nicht im Hintergrund stoppen. Also einmal

sudo kill <PID>

funktioniert, aber wenn wir unseren Code aktualisieren und speichern, tritt dieses Problem erneut auf, wie bei Nodemon .

Wenn Sie das Terminal verlassen, wird das Problem behoben. ODER

  killall -9 node

2
Weder lsof noch netstat gaben etwas zurück, dennoch schien es einen Prozess zu geben, bei dem der Port verwendet wurde. Nachdem killall -9 nodeich den Server lokal ausführen konnte.
Julsteri

Danke für den Befehl killall -9 node. es funktionierte auf Goorm IDE
ifhy

22

Für Windows würde der Task-Manager definitiv einen Knotenprozess anzeigen, der ausgeführt wird. Versuchen Sie, den Prozess zu beenden, es wird das Problem lösen.


21

Ich hatte das gleiche Problem. (Die folgenden Schritte funktionieren unter Windows 10 einwandfrei.)

  1. Öffnen Sie den Task-Manager (drücken Sie Ctrl+ Alt+ Delete).
  2. Wählen Sie die Registerkarte "Prozesse".
  3. Suchen Sie nach 'Node.js: Serverseitiges JavaScript'
  4. Wählen Sie es aus und klicken Sie auf die Schaltfläche "Aufgabe beenden"

Jetzt kannst du rennen npm start.

Hoffe es hilft dir.


20

Vielleicht können Sie dies als Referenz nehmen. Diese einzelne Befehlszeile kann den Prozess beenden, der auf einem bestimmten Port ausgeführt wird.

npx kill-port 3000

Geben Sie hier die Bildbeschreibung ein


Mehrere Ports töten.

npx kill-port 3000 8080 4200

7

Ich habe das Gleiche gesehen und alle oben genannten Vorschläge ohne Erfolg ausprobiert. Hier sind Schritte, die das Problem für mich lösen: - WLAN ausschalten - npm starten (dies sollte funktionieren) - WLAN einschalten

Ich bin mir nicht ganz sicher, was das Grundproblem ist, aber das hat es für mich gelöst.


Mir ist das gerade auch passiert. netstat -anohat nichts mit Port 3000 aufgelistet.
Nathan

Verdammt, das hat es auch für mich gelöst, da auf Port 3000 offensichtlich nichts lief. Ich hatte dieses Problem nach einem Windows-Update. Ich habe nie daran gedacht, WiFi auszuschalten. Vielen Dank für die Lösung dieses
Problems

7

Beenden eines Prozesses, dem Port 3000 gehört

Schauen wir uns zunächst an, wie wir einen Prozess beenden können, bei dem ein Port geöffnet ist.

Mit dem Befehl lsof können wir die PID mit dem angegebenen Port abrufen:

$ lsof -i :3000 -t
12345

Dann können wir diesen Prozess beenden, indem wir Folgendes tun:

$ kill 12345

Lassen Sie uns dies in einen Einzeiler verwandeln:

lsof -i 3000 -t | xargs kill

Wenn Sie eine Umgebungsvariable zum Festlegen des Serverports verwenden, können Sie Folgendes angeben, anstatt unsere Werte fest zu codieren:

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

Zuletzt können wir standardmäßig Port 3000 verwenden, wenn die Umgebungsvariable nicht festgelegt ist:

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

Nodemon dazu bringen, Hooks auszuführen

Mit Nodemon können Sie Ereignis-Hooks über die Konfigurationsdatei nodemon.json einrichten:

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

Dies führt dazu, dass nodemon den ${PORT:-3000} -t | xargsBefehl sh -c 'lsof -i: kill ausführt , wenn Ihre App abstürzt, wodurch der untergeordnete Prozess beendet wird, der den Port offen hält.

oder du kannst es versuchen

fuser -k PORT-NO/tcp

z.B:

fuser -k 3000/tcp

Dies ist eine schöne und saubere Lösung, um einen Prozess zu beenden. Ich muss jedes Mal nachsehen, wie das geht, und das ist die schönste Lösung, die ich je gesehen habe!
Twknab

lsof -i :3000 -t
Ich habe

@xaunlopez versuchen Sie dieses fuser -k port-number/tcp
Afeesudheen

6

Ich habe einen Express-Server mit nodemon auf NodeJS verwendet. Ich habe die folgende Meldung erhalten und es scheint ein Fehler zu sein:

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

Es gibt eine allgemeine Lösung: Wenn Sie alle Knotenserververbindungen beenden, können Sie diesen Code in Ihre Datei package.json einfügen:

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

Darüber hinaus habe ich mehrere Lösungen gefunden, Windows-Befehl und Bash auf Win 10 x64.

Alle meine Notizen sind hier:


# Beenden Sie alle NodeJS-Serververbindungen

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

# Beispiel: Öffnen Sie den Windows Task-Manager und sehen Sie die PID-Nummer "node.exe" unter Windows

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

# Beenden Sie einen Prozess in Windows anhand der Portnummer (Beispiel)

Für Hilfe:

$ taskkill /?
$ tskill /?

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

Code 2:

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

Code 3:

$ tskill 14228

# Befehlszeile zum Anzeigen eines bestimmten Ports

in cmd:

$ netstat -ano | find "14228"

in bash:

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

# Suchen Sie node.exe mit dem Befehl "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

Das passiert mir manchmal, EADDR im Einsatz. Normalerweise versteckt sich im Hintergrund ein Terminalfenster, in dem die App noch ausgeführt wird. Sie können den Vorgang mit Strg + C im Terminalfenster stoppen.

Oder vielleicht hören Sie den Port aufgrund von copy / pasta =) mehrmals ab


Danke für die Hilfe! Ich habe keine anderen Terminalfenster geöffnet. Was sollte ich sonst noch überprüfen?
user2573690

Suchen Sie einen Knoten oder einen npm-Prozess und beenden Sie ihn. Wenn Sie immer noch einen Funk haben, starten Sie den Computer neu oder wählen Sie einfach einen anderen Port aus, mit dem Sie arbeiten möchten. Es gibt wirklich keinen Grund , es muss Port 3000 oder 8080 sein
sova

Ich habe gerade eine neue Knoten-App erstellt und sie auf Port 3000 gestartet. Diese scheint einwandfrei zu funktionieren. Wenn ich jedoch versuche, mein vorhandenes Projekt auszuführen, wird der Port verwendet. Haben Sie jemals dieses Problem gehabt?
user2573690

@ user2573690 Ich bin noch nie darauf gestoßen, aber vielleicht haben Sie mehrere JS-Dateien (wie eine app.js und eine index.js), in denen eine .listen()mehrmals aufruft ?
Sova

2
Danke dir! Ich habe es herausgefunden, ich habe mehrmals auf den Port gehört, Kopier- / Nudelunfall! Wenn Sie Ihre Antwort bearbeiten und das Stück hinzufügen können, werde ich es markieren. Nochmals vielen Dank!
user2573690

5

Öffnen Sie den Task-Manager (drücken Sie Strg + Alt + Entf. Wählen Sie die Registerkarte "Prozesse". Suchen Sie nach "Node.js: Serverseitiges JavaScript". Wählen Sie diese aus und klicken Sie auf die Schaltfläche "Aufgabe beenden"


2

Kam von Google hierher mit einer Lösung für High Sierra.

Im Netzwerk-Setup von Macos hat sich etwas geändert, und einige Apps (einschließlich Ping) können localhost nicht auflösen.

Das Bearbeiten von / etc / hosts scheint eine Lösung zu sein:

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

Oder einfach (wenn Sie sicher sind, dass Ihre / etc / hosts leer ist) sudo echo '127.0.0.1 localhost' > /etc/hosts


2

Ich habe 2 Stunden damit verbracht herauszufinden, warum EADDRINUSEich keine App lazyConnect: true, starten durfte (andere Node-Express-Server waren in Ordnung ) ... sie funktionierte nach dem Hinzufügen zur Datenquellenkonfiguration.

Frag mich nicht, warum es geholfen hat. Ich weiß nicht. Ich stelle diese Informationen hier nur für Leute bereit, die das gleiche Problem haben.


für die Hilfsbereitschaft UND eine Lösung, die helfen kann, die Grundursache zu finden.
Titou

2

Ich habe dieses Problem mit Git Bash unter Windows. Ich renne npm startoder node app.js. Nachdem es mit Strg + C kurz beendet und versuchte , den Server erneut verwenden zu beginnen npm startoder node app.jsdann diese Fehlermeldung erhielt ich.

Wenn ich dies mit der regulären Windows-Eingabeaufforderung mache , funktioniert es jedoch einwandfrei.

Oder Sie können es auf andere Weise tun. Öffnen Sie den Task-Manager und suchen Sie die Zeile " Node.js: Serverseitiges JavaScript ". Wählen Sie das aus und beenden Sie die Aufgabe . Es sollte jetzt funktionieren.

Vielen Dank.


2

Wenn Sie nur einen Port schließen möchten, führen Sie einfach diesen Befehl aus. kill -9 $(lsof -t -i:3000)

Der Unterschied zwischen pkillund killist jemand Prozess Ton. In kill wenden Sie einen Filter an. Sie stoppen einfach den gewünschten Port.

Der pkillBefehl schließt alle Knotenprozesse. pkill -9 node

Verwenden Sie pkill, um Speicherverluste zu vermeiden, die gelegentlich während der Entwicklung auftreten. Wenn es mehr als einen Knoten gibt, werden alle getötet.

Die Verwendung von Skripten in package.json wird ebenfalls veranschaulicht.

"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

Versuchen Sie, den localhost in Ihrem Browser zu öffnen. Geben Sie einfach: localhost:3000in die Adressleiste ein.

Wenn die App geöffnet wird, bedeutet dies, dass Ihre vorherige npm runnoch aktiv ist. Jetzt können Sie einfach Änderungen am Code vornehmen und die Auswirkungen sehen, wenn Sie dieselbe App entwerfen oder wenn Sie eine andere App ausführen möchten. Ändern Sie einfach den Code (in index.js der zuvor ausgeführten App) ein wenig und ( Aktualisiere wahrscheinlich die Browser-Registerkarte), um sie zum Absturz zu bringen;) ..... Jetzt starte sie npm run starterneut aus deinem neuen App-Verzeichnis. Hoffe das hilft! :) :)

oder

Sie können den Task-Manager (WINDOWS_KEY + X> Task-Manager) öffnen und sehen die Zeile "Node.js: Serverseitiges JavaScript". Wählen Sie das aus und beenden Sie die Aufgabe .... Es sollte jetzt funktionieren !!



Wenn nicht, ändern Sie die .envDatei Ihrer App, um port:3002die neue App einzuschließen, und führen Sie sie aus. Auf diese Weise können Sie zwei separate Apps an verschiedenen Ports ausführen. Prost!!


1

Für Windows-Benutzer stoppen Sie einfach alle Prozesse von Node.js im Task-Manager

Hoffe es wird helfen


1

Einfach unter Linux

  • Öffnen Sie Ihr Terminal
  • Freier Port von Prozessen -> kill $ (lsof -t -i: $ port)

1

Ich bin auch auf das gleiche Problem gestoßen. Der beste Weg zur Lösung ist (für Windows) :

  1. Gehen Sie zum Task-Manager .

  2. Scrollen Sie und suchen Sie einen Aufgabenprozess mit dem Namen. Node.js: Serverseitiges JavaScript Bild als Referenz hinzugefügt

  3. Beenden Sie diese spezielle Aufgabe.

Los geht's! Jetzt npm starten und es wird wie bisher funktionieren!



0

Möglicherweise handelt es sich um einen Verwaltungsprozess, der im Hintergrund ausgeführt wird und netstatdies nicht anzeigt.
Verwenden Sie tasklist | grep node, um die PID dieses Administrationsprozesses zu ermitteln und dannkill PID


0

Wenn Sie Webstorm verwenden, stellen Sie einfach sicher, dass Ihr Standardport nicht 3000 aus Datei -> Einstellungen -> Erstellen, Ausführen, Bereitstellen -> Debugger ist

Eingebauter Server-Port

und setzen Sie es auf "63342" oder sehen Sie diese Antwort WebStorm LiveEdit Port ändern (63342)


0

In package.json-Skripten enthalten:

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

Ich glaube, das Problem war für mich die Zeit, in der der alte Port nicht rechtzeitig von nodemon für den Neustart heruntergefahren wurde. Ich habe das Problem mit Multer erlebt.


Passen Sie die Verzögerung nach Bedarf an.
Kalkhas

0

An zwei Stellen können Server- oder App-Listen () -Methoden hinzugefügt werden. Suchen Sie in den Starts der Anwendung nach listen () -Methoden. Aus diesem Grund wurde die Rückkehr als Server an Port XXXX und Port XXXX gestartet, die bereits verwendet werden


0

Unter meinen Umständen hatte ich gerade angefangen, VS Code zu verwenden, und war einem Tutorial mit Sequelize gefolgt. Am Ende hatte ich eine bin / www-Datei, in der sich listen () befand. Ich wusste nichts davon und führte meine App aus, indem ich den Knoten app.js ausführte. Wenn es nicht funktionierte, fügte ich den Express-Server mit .listen () hinzu (was gut funktionierte).

Aber als ich anfing, nodemon und VSCode zu verwenden, wurde auf bin / www gezeigt und das erforderte meine app.js.

Lange Rede, kurzer Sinn, ich hatte meiner app.js .listen () hinzugefügt und führte app.js direkt aus, wenn ich das nicht hätte hinzufügen und bin / www ausführen sollen.


0

In Ubuntu greifen Sie zuerst auf den Prozess zu, indem Sie die Portnummer verwenden: sudo lsof -i: 3000, und verwenden Sie dann den Befehl kill, um den Prozess zu beenden. Wenn die Prozess-PID beispielsweise 4493 lautet, verwenden Sie den Befehl use: kill 4493 , für Mac oder Windows suchen Sie den zugehörigen Befehl

Geben Sie hier die Bildbeschreibung ein


0

Ich habe dieses Problem gelöst, weil die MongoDB oder eine andere App, die Sie zuvor auf diesem Port ausgeführt haben, den Prozess vom Task-Manager abbricht oder einfach die Nummer des Ports von 3000 auf eine andere ändert.


0

Es ist sehr einfach. Sie können es in 2 einfachen Schritten beheben.

  1. Überprüfen Sie Ihre Umgebungsvariablen, wenn ein Schlüssel / Eintrag mit dem Namen "PORT" vorhanden ist.
  2. Wenn gefunden, löschen Sie diesen Eintrag oder benennen Sie ihn in etwas anderes um.

Es stellt sich heraus, dass ein anderes Programm diese Variable verwendet. Wenn Sie React-Skripte starten, wird normalerweise nach einer Umgebungsvariablen mit dem Titel PORT gesucht.


-1

Bevor Sie nodemon ausführen, starten Sie bitte zuerst mongod. Sie werden diesen Fehler niemals erhalten. :) :)


-2

Überprüfen Sie, ob auf demselben Port ein Prozess ausgeführt wird, indem Sie den folgenden Befehl eingeben:

sudo ps -ef

Sie können den Prozess finden, der auf dem jeweiligen Knotenport ausgeführt wird, und dann den Knoten durch beenden

kill -9 <node id>

Wenn das Problem weiterhin besteht, töten Sie einfach den gesamten Knoten

killall node

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.