Wenn ich einen Server mit Port 80 betreibe und versuche, xmlHTTPrequest zu verwenden, wird folgende Fehlermeldung angezeigt :Error: listen EADDRINUSE
Warum ist es für nodejs ein Problem, wenn ich eine Anforderung ausführen möchte, während ich einen Server auf Port 80 ausführe? Für die Webbrowser ist das kein Problem: Ich kann im Internet surfen, während der Server läuft.
Der Server ist:
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort;
console.log('connection request from: ' + socket.remoteAddress);
socket.destroy();
}).listen(options.port);
Und die Anfrage:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
sys.puts("State: " + this.readyState);
if (this.readyState == 4) {
sys.puts("Complete.\nBody length: " + this.responseText.length);
sys.puts("Body:\n" + this.responseText);
}
};
xhr.open("GET", "http://mywebsite.com");
xhr.send();
javascript
node.js
Danny Fox
quelle
quelle
Antworten:
EADDRINUSE
bedeutet, dass die Portnummerlisten()
, an die der Server gebunden werden soll, bereits verwendet wird.In Ihrem Fall muss also bereits ein Server auf Port 80 ausgeführt werden.
Wenn auf diesem Port ein anderer Webserver ausgeführt wird, müssen Sie node.js hinter diesen Server stellen und ihn durch diesen übertragen.
Sie sollten nach dem
listening
Ereignis wie diesem suchen, um festzustellen, ob der Server wirklich zuhört:quelle
Was mir wirklich geholfen hat war:
Dies wird jedoch einen Systemprozess beenden.
Mit
Sie können überprüfen, ob es funktioniert hat.
quelle
ps aux | grep node
würde das zeigen. Beenden Sie die Anwendung mit STRG + C, anstatt die Anwendung mit STRG + Z zu beenden . Dadurch wird die Anwendung ordnungsgemäß beendet und die Portbindung wird entfernt.Das oben erwähnte
killall -9 node
, von Patrick vorgeschlagene Verfahren funktioniert wie erwartet und löst das Problem. Möglicherweise möchten Sie jedoch den Bearbeitungsteil dieser Antwort darüber lesen, warum dieskill -9
möglicherweise nicht der beste Weg ist.Darüber hinaus möchten Sie möglicherweise auf einen einzelnen Prozess abzielen , anstatt alle aktiven Prozesse blind zu beenden .
In diesem Fall rufen Sie zuerst die Prozess-ID (PID) des Prozesses ab, der an diesem Port ausgeführt wird (z. B. 8888):
lsof -i tcp:8888
Dies wird so etwas wie zurückgeben:
Dann machen Sie einfach (ps - eigentlich nicht . Bitte lesen Sie weiter unten):
kill -9 57385
Sie können ein bisschen mehr über das lesen hier .
EDIT: Ich habe heute über ein ziemlich verwandtes Thema gelesen und bin auf diesen interessanten Thread gestoßen, warum ich keinen
kill -9
Prozess machen sollte .Wie bereits erwähnt, sollten Sie den obigen Prozess besser beenden mit:
kill -15 57385
BEARBEITEN 2 : Wie in einem Kommentar hier oft erwähnt, ist dieser Fehler eine Folge davon, dass ein Prozess nicht ordnungsgemäß beendet wird. Das bedeutet, dass viele Leute einen Knotenbefehl (oder einen anderen) mit STRG + Z beenden . Die richtige Methode zum Stoppen eines laufenden Prozesses besteht darin, den Befehl STRG + C auszugeben, der einen sauberen Exit ausführt.
Wenn Sie einen Prozess auf die richtige Weise beenden, wird dieser Port beim Herunterfahren freigegeben. Auf diese Weise können Sie den Prozess neu starten, ohne sich die Mühe machen zu müssen, ihn selbst zu beenden, bevor Sie ihn erneut ausführen können.
quelle
pgrep node
Zeigt an, ob ein Knotenprozess auf Ihnen weggelaufen ist.pkill node
wird sie töten.Nur einen Kopf hoch, Skype überwacht manchmal Port 80 und verursacht daher diesen Fehler, wenn Sie versuchen, Port 80 von Node.js oder einer anderen App abzuhören.
Sie können dieses Verhalten in Skype deaktivieren, indem Sie auf die Optionen zugreifen und auf Erweitert -> Verbindung -> Port 80 verwenden klicken (Deaktivieren Sie diese Option).
quelle
Sie sollten versuchen, den Prozess zu beenden, der Port 80 überwacht.
Killall beendet alle laufenden Knoten-Apps. Vielleicht möchten Sie das nicht tun. Mit diesem Befehl können Sie nur die eine App beenden, die einen bekannten Port überwacht.
Wenn Sie Unix verwenden, versuchen Sie diesen Befehl:
quelle
Zwei mögliche Lösungen für Windows / Mac
1. Freie Portnummer
Windows
Mac
Sie können netstat versuchen
Verwenden Sie für OSX El Capitan und höher (oder wenn Ihr netstat -p nicht unterstützt) lsof
Wenn sich Ihr Problem dadurch nicht beheben lässt, können
Mac
Benutzer auf die vollständige Diskussion zu diesem Problem verweisen. Suchen (und Beenden) des Prozesses 3000 zum Sperren von Port 3000 auf dem Mac2. Portnummer ändern?
Windows
Mac
quelle
netstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Unter einer Controller-Umgebung können Sie Folgendes verwenden:
pkill node
Bevor Sie Ihr Skript ausführen, sollten Sie den Job erledigen.Denken Sie daran, dass dieser Befehl alle töten wird
node
Prozesse möglicherweise richtig, wenn Sie einen Container haben, in dem nur eine Instanz ausgeführt wird. Sie haben eine solche Umgebung, in der Sie dies garantieren können.In jedem anderen Szenario empfehle ich, einen Befehl zu verwenden, um eine bestimmte Prozess-ID oder einen bestimmten Namen zu beenden, die Sie gefunden haben, indem Sie programmgesteuert danach suchen. Wenn Ihr Prozess aufgerufen wird, können Sie beispielsweise Node-Server-1 ausführen
pkill node-server-1
.Diese Ressource kann hilfreich sein, um Folgendes zu verstehen: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/
quelle
pgrep node
vor der Hand, wenn Sie ein wenig vorsichtig sein wollen und sehen wollen, welchenode
Prozesse laufenIhre Anwendung wird bereits auf diesem Port 8080 ausgeführt. Verwenden Sie diesen Code, um den Port zu beenden und Ihren Code erneut auszuführen
quelle
kill -9
mit ziemlicher Sicherheit übertrieben und meiner Meinung nach ein schrecklicher Ratschlag, den man ohne besondere Warnungen geben sollte es. Nurkill
würde wahrscheinlich den Trick tun, und wirklich, das grundlegende Problem in dieser Frage ist, glaube ich, dass sie wieder laufen einen sind versucht , Server immer und immer wieder, so dass dies nur ein Hack, kein fix. Sie müssen besser verstehen, was los ist, was diese Antwort nicht wirklich liefert.Eine andere Sache, die diesen Fehler verursachen kann, sind zwei HTTP-Server im selben Knotencode. Ich habe Express 2 auf Express 3 aktualisiert und hatte diesen ...
Und es hat diesen Fehler ausgelöst.
quelle
Das funktioniert bei mir (ich benutze Mac). Führen Sie diesen Befehl aus
lsof -PiTCP -sTCP:LISTEN
Daraufhin wird eine Liste der Ports angezeigt, die Ihr Syetem verwendet. Finden Sie heraus,
PID
dass Ihr Knoten ausgeführt wirdund Renn
kill -9 [YOUR_PID]
quelle
EADDRINUSE
bedeutet, dass der Port (den wir in der Knotenanwendung abhören wollen) bereits verwendet wird. Um dies zu überwinden, müssen wir identifizieren, welcher Prozess mit diesem Port ausgeführt wird.Zum Beispiel, wenn wir versuchen, unsere Knotenanwendung im 3000-Port abzuhören. Wir müssen überprüfen, ob dieser Port bereits von einem anderen Prozess verwendet wird.
Schritt 1:
Dass der obige Befehl das folgende Ergebnis liefert.
Schritt 2:
Jetzt hast du die Prozess-ID (25315). Töte diesen Prozess.
Schritt 3:
Hinweis: Diese Lösung für Linux-Benutzer.
quelle
quelle
für Force Kill
Verwenden Sie oben cmd, um einen bestimmten Port zu beenden und dann Ihren Server auszuführen
quelle
Versuchen Sie beide Befehle und es wird der gesamte Knotenprozess gestoppt.
quelle
Dieser Fehler tritt auf, wenn ein Prozess an einem Port ausgeführt wird, an dem Sie Ihre Anwendung ausführen möchten.
Wie wird der Prozess auf diesem Port ausgeführt? => Befehl: sudo netstat -ap | grep: 3000
Ausgabe: Sie erhalten die Prozessinformationen, die diesen Port verwenden
tcp 0 0 IP-Adresse: 3000 : LISTEN 26869 / node
Jetzt können Sie diesen Prozess abbrechen sudo kill -9 26869
quelle
Im folgenden Befehl ersetzen Sie Ihre portNumber
quelle
EADDRINUSE bedeutet, dass der Port Ihrer nodejs-App bereits verwendet wird.
quelle
Es gibt eine Möglichkeit, den Prozess mit dem Task-Manager zu beenden:
Gehen Sie zum Task-Manager (oder verwenden Sie die Verknüpfung Ctrl+ Shift+ Esc).
Suchen Sie unter "Hintergrundprozesse" nach "Node.js" -Prozessen und beenden Sie sie (klicken Sie mit der rechten Maustaste darauf und wählen Sie "Aufgabe beenden").
quelle
Ich habe diesen Fehler bereits (im Knoten) bei http.client gesehen, und wie ich mich erinnere, hatte das Problem damit zu tun, dass der httpClient nicht initialisiert oder schlechte Optionen bei der httpClient-Erstellung und / oder in der URL-Anforderung festgelegt wurden.
quelle
Ich habe auch das gleiche Problem, und ich schließe einfach das Terminal und öffne ein neues Terminal und starte
nochmal. Das funktioniert bei mir, einige Zeit muss nur ein paar Sekunden warten, bis es wieder funktioniert.
Dies funktioniert jedoch nur auf einem Entwicklercomputer anstelle einer Serverkonsole.
quelle
Fehler: listen EADDRINUSE bedeutet, dass der Port, den Sie Ihrem Anwendungsserver zuweisen / binden möchten, bereits verwendet wird. Sie können Ihrer Anwendung entweder einen anderen Port zuweisen.
Oder wenn Sie der App denselben Port zuweisen möchten. Beenden Sie dann die Anwendung, die an Ihrem gewünschten Port ausgeführt wird.
Suchen Sie für eine Knotenanwendung die Prozess-ID für die Knotenanwendung wie folgt:
Nachdem Sie die Prozess-ID erhalten haben, tun Sie dies
quelle
Auf Debian habe ich herausgefunden, dass auf Port 80 ausgeführt werden muss. Sie müssen den Befehl als root ausgeben, dh
Ich hoffe, es hilft
quelle
In meinem Fall wurde Apache HTTP Server auf Port 80 ausgeführt. Ich habe es gelöst, indem ich den Befehl als root ausgegeben habe
sudo killall httpd
Aktualisieren
Wenn Jenkin auf Ihrem Mac installiert ist und ausgeführt wird;
sudo lsof -i tcp:8080
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
quelle
Es scheint, dass ein anderer Node ng Serve-Prozess ausgeführt wird. Überprüfen Sie dies, indem Sie dies in Ihre Konsole (Linux / Mac) eingeben:
und beenden Sie es mit:
ODER alternativ verwenden
um Ihr Projekt auf einem freien Hafen Ihrer Wahl zu bedienen.
quelle
Während Sie den NODE_PORT beenden, wird möglicherweise Ihr Chrome-Prozess oder alles, was denselben Port abhört, abgebrochen, und das ist ärgerlich.
Dieses Shell-Skript kann hilfreich sein - in meinem Fall ist der Port 1337, aber Sie können ihn jederzeit ändern
quelle
In meinem Fall verwende ich ein Webhosting, aber es ist dasselbe wie beim lokalen Host. Ich habe Folgendes verwendet:
Um den Knotenprozess zu beobachten, zeigt die Konsole den Prozess mit PID an. Um den Prozess abzubrechen, müssen Sie diesen Befehl verwenden:
Dabei ist PID die Prozess-ID aus dem obigen Befehl.
quelle
Zwei Server können nicht denselben Port überwachen. Überprüfen Sie daher, ob andere Server denselben Port überwachen. Überprüfen Sie auch, ob der Browser synchronisiert ist, wenn er auf demselben Port ausgeführt wird
quelle
Für andere Personen unter Windows 10 mit Knoten als
localhost
und läuft auf einem Port wie 3500, nicht 80 ...Was funktioniert nicht:
Was Informationen anzeigt, aber immer noch nicht funktioniert:
Was funktioniert:
Git Bash oder Powershell unter Windows
Beachten Sie die PID (ganz rechts), die
ich nicht
killall
zur Arbeit bringen konnte ... alsoNach dieser nicht so lustigen Übung unter Windows wurde mir klar, dass ich den Task-Manager verwenden und die Node-Engine finden und einfach beenden kann.
Zu Ihrer Information, ich habe Visual Studio Code verwendet, um Node auf Port 3500 auszuführen, und ich verwende die Git Bash-Shell im VS-Code. Ich hatte anmutig mit Strg + C beendet, aber manchmal tötet dies es nicht. Ich möchte meinen Port nicht ändern oder neu starten, damit dies funktioniert. Hoffentlich hilft es anderen. Ansonsten ist es Dokumentation für mich.
quelle
Für Windows-Benutzer führen Sie den folgenden Befehl im PowerShell-Fenster aus, um alle Knotenprozesse abzubrechen.
quelle
Die Option, die für mich funktioniert:
Lauf:
Sie erhalten so etwas wie:
quelle