Wenn ich einen Server mit dem Port 80 betreibe und versuche, xmlHTTPrequest zu verwenden erhalte ich diesen Fehler: Error: listen EADDRINUSE
Warum ist es für nodejs ein Problem, wenn ich eine Anfrage stellen möchte, während ich einen Server am Port 80 betreibe? Für die Webbrowsers 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 Bitte:
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();
EADDRINUSE
bedeutet, dass die Portnummer, an die listen()
den Server zu binden versucht, bereits verwendet wird.
In Ihrem Fall muss also auf Port 80 bereits ein Server ausgeführt werden.
Wenn auf diesem Port ein anderer Webserver ausgeführt wird, müssen Sie node.js hinter diesen Server stellen und diesen Proxy durchlaufen lassen.
Sie sollten wie folgt auf das listening
-Ereignis prüfen, um zu sehen, ob der Server wirklich zuhört:
var http=require('http');
var server=http.createServer(function(req,res){
res.end('test');
});
server.on('listening',function(){
console.log('ok, server is running');
});
server.listen(80);
Was mir wirklich geholfen hat, war:
killall -9 node
Dies bringt jedoch einen Systemprozess zum Erliegen.
Mit
ps ax
sie können überprüfen, ob es funktioniert hat.
Der oben erwähnte killall -9 node
, der von Patrick vorgeschlagen wird, funktioniert wie erwartet und löst das Problem. Möglicherweise möchten Sie jedoch den Bearbeitungsteil dieser Antwort lesen, der besagt, warum kill -9
möglicherweise nicht der beste Weg ist.
Darüber hinaus möchten Sie möglicherweise einen single -Prozess anvisieren, anstatt all aktive Prozesse blind zu töten.
Rufen Sie in diesem Fall zuerst die Prozess-ID (PID) des Prozesses ab, der auf diesem Port ausgeführt wird (z. B. 8888):
lsof -i tcp:8888
Dies wird etwas zurückgeben:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 57385 You 11u IPv6 0xac745b2749fd2be3 0t0 TCP *:ddi-tcp-1 (LISTEN)
Dann machen Sie einfach (ps - eigentlich nicht. Bitte lesen Sie weiter unten):
kill -9 57385
Sie können etwas mehr über dieses hier lesen.
EDIT: Ich habe heute zu einem ziemlich verwandten Thema gelesen und bin über diesen interessanten Thread zu Warum sollte ich nicht einen Prozesskill -9
?
Im Allgemeinen sollten Sie kill -15 vor kill -9 verwenden, um dem Zielprozess die Möglichkeit zu geben, sich selbst zu säubern. (Prozesse können SIGKILL nicht fangen oder ignorieren, aber sie können und werden oft SIGTERM fangen.) Wenn Sie dem Prozess nicht die Möglichkeit geben, den Vorgang abzuschließen und zu bereinigen, bleiben möglicherweise beschädigte Dateien (oder andere Zustände) in der Nähe dass es nicht in der Lage sein wird, nach dem Neustart zu verstehen.
Wie gesagt, sollten Sie den oben genannten Prozess besser beenden mit:
kill -15 57385
EDIT 2: Wie in einem Kommentar hier oft erwähnt wurde, ist dieser Fehler eine Folge davon, dass ein Prozess nicht ordnungsgemäß beendet wurde. Das heißt, viele Leute beenden einen Knotenbefehl (oder einen anderen Befehl) mit STRG + Z. Der korrekte Weg zum Stoppen eines laufenden Prozesses ist der Befehl CTRL + C, 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 erneut starten, ohne sich die Mühe machen zu müssen, ihn selbst zu töten, bevor Sie ihn erneut ausführen können.
** VOR DEM DOWNVOTING - Bitte LESEN Sie die Antwort. IT IS RELEVANT! Wenn Sie dies ablehnen, hinterlassen Sie einen Kommentar, warum Sie der Meinung sind, dass es nicht relevant ist.
Nur einen Kopf höher, hört Skype manchmal auf Port 80 und verursacht 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.
Sie sollten versuchen, den Prozess zu beenden, der an Port 80 überwacht wird.
Killall beendet alle laufenden Knoten-Apps. Möglicherweise möchten Sie das nicht tun. Mit diesem Befehl können Sie nur die App beenden, die einen bekannten Port abhört.
Wenn Sie Unix verwenden, versuchen Sie diesen Befehl:
Sudo fuser -k 80/tcp
pkill node
sollte vor der Ausführung des Skripts ausgeführt werden.
Ihre Anwendung wird bereits auf diesem Port 8080 ausgeführt .. Verwenden Sie diesen Code, um den Port zu beenden und den Code erneut auszuführen
Sudo lsof -t -i tcp:8080 | xargs kill -9
Eine andere Sache, die zu diesem Fehler führen kann, sind zwei HTTP-Server im selben Knotencode. Ich habe ein paar Express 2 zu Express 3 Code aktualisiert und hatte dies ...
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
// tons of shit.
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
Und es hat diesen Fehler ausgelöst.
Das funktioniert für mich (ich verwende mac). Führen Sie diesen Befehl aus
lsof -PiTCP -sTCP:LISTEN
Dies zeigt eine Liste der Ports an, die Ihr Syetem verwendet. Suchen Sie die PID
, die Ihr Knoten ausführt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 17269 hientrq 16u IPv6 0xc42959c6fa30c3b9 0t0 TCP *:51524 (LISTEN)
node 17269 hientrq 19u IPv4 0xc42959c71ae86fc1 0t0 TCP localhost:1337 (LISTEN)
und kill -9 [YOUR_PID]
ausführen
Fehlerursache: Sie versuchen den beschäftigt
port number
zu verwenden.
Es gibt zwei mögliche Lösungen, um dieses Problem unter Windows/Mac zu beheben.
Windows
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
Mac
Sie können netstat ausprobieren
netstat -vanp tcp | grep 3000
Verwenden Sie für OSX El Capitan und neuer (oder wenn Ihr netstat -p nicht unterstützt) lsof
Sudo lsof -i tcp:3000
wenn das Problem dadurch nicht gelöst wird, können Mac
-Benutzer auf die vollständige Diskussion dieses Problems verweisen. Suchen (und Beenden) von Prozessverriegelungsport 3000 auf dem Mac
Windows
set PORT=5000
Mac
export PORT=5000
EADDRINUSE
bedeutet, dass der Port (den wir in der Knotenanwendung abhören möchten) bereits verwendet wird. Um zu überwinden, müssen wir feststellen, welcher Prozess mit diesem Port ausgeführt wird.
Zum Beispiel, wenn wir versuchen, unsere Knotenanwendung im 3000-Port abzuhören. Wir müssen prüfen, ob dieser Port bereits von einem anderen Prozess verwendet wird.
$Sudo netstat -plunt |grep :3000
Dass der obige Befehl unten ergibt.
tcp6 0 0 :::3000 :::* LISTEN 25315/node
Jetzt haben Sie die Prozess-ID (25315). Diesen Prozess beenden.
kill -9 25315
npm run start
Hinweis: Diese Lösung für Linux-Benutzer.
Sudo töten $ (Sudo lsof -t -i: 80)
für Gewalttötung
Sudo töten -9 $ (Sudo lsof -t -i: 80)
verwenden Sie über cmd, um einen bestimmten Port zu beenden, und führen Sie dann den Server aus
Probieren Sie beide Befehle aus, und der Knotenprozess wird beendet.
killall 9 node
pkill node
npm start
Dieser Fehler tritt auf, wenn auf einem Port, an dem Sie Ihre Anwendung ausführen möchten, ein Prozess ausgeführt wird.
wie kann man erreichen, welcher Prozess an diesem Port ausgeführt wird => Befehl: Sudo netstat -ap | grep: 3000
ausgabe: Sie erhalten die Prozessinformationen, die diesen Port verwenden
tcp 0 0 IP-Adresse: 3000: LISTEN 26869/Knoten
Jetzt können Sie diesen Prozess beenden Sudo kill -9 26869
Fehler: EADDRINUSE abhören Der Port, den Sie Ihrem Anwendungsserver zuweisen/binden möchten, wird bereits verwendet. Sie können Ihrer Anwendung entweder einen anderen Port zuweisen.
Oder wenn Sie der App den gleichen Port zuweisen möchten. Beenden Sie anschließend die Anwendung, die am gewünschten Port ausgeführt wird.
Suchen Sie für eine Knotenanwendung nach der Prozess-ID für die Knotenanwendung, die Sie ausprobieren können:
ps -aux | grep node
Nachdem Sie die Prozess-ID erhalten haben, tun Sie dies
kill process_id
Ich habe auch das gleiche Problem und ich schließe einfach das Terminal und öffne ein neues Terminal und renne
node server.js
nochmal. das funktioniert für mich, einige Zeit muss nur ein paar Sekunden warten, bis es wieder funktioniert.
Dies funktioniert jedoch nur auf einer Entwicklermaschine anstelle einer Serverkonsole.
Im folgenden Befehl ersetzen Sie Ihre Portnummer
Sudo lsof -t -i tcp:portNumber | xargs kill -9
Ich habe diesen Fehler vor (in node) mit http.client gesehen, und wie ich mich erinnere, hatte das Problem damit zu tun, den httpClient nicht zu initialisieren oder schlechte Optionen in der httpClient-Erstellung und/oder in der URL-Anforderung festzulegen.
Unter Debian habe ich herausgefunden, dass ich auf Port 80 laufen muss, um den Befehl als root auszuführen
Sudo node app.js
Ich hoffe, es hilft
In meinem Fall wurde Apache HTTP Server auf Port 80 ausgeführt. Ich löste es, indem ich den Befehl als root ausgab
Sudo killall httpd
Update
Wenn Jenkin auf Ihrem Mac installiert ist und ausgeführt wird;
Sudo lsof -i tcp:8080
überprüfen.Sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Es scheint, dass ein anderer Node-Server-Prozess läuft. Überprüfen Sie dies, indem Sie Folgendes in Ihre Konsole eingeben (Linux/Mac):
ps aux|grep node
und beenden Sie es mit:
kill -9 <NodeProcessId>
ODER alternativ verwenden
ng serve --port <AnotherFreePortNumber>
um Ihr Projekt auf einem freien Port Ihrer Wahl bereitzustellen.
Für andere Personen unter Windows 10 mit Knoten als localhost
und auf einem Port wie 3500 und nicht 80 ...
Was funktioniert nicht:
killall ? command not found
ps -aux | grep 'node' ? ps: user x unknown
Was zeigt Informationen, funktioniert aber immer noch nicht:
ps -aef | grep 'node'
ps ax
kill -9 61864
Was funktioniert:
Git Bash oder Powershell unter Windows
net -a -o | grep 3500 (whatever port you are looking for)
Beachten Sie die PID (ganz rechts)
Ich konnte killall
nicht zur Arbeit bringen ... also
Nach dieser nicht so lustigen Übung unter Windows wurde mir klar, dass ich den Task-Manager verwenden und die Node-Engine finden und beenden kann.
Zu Ihrer Information, ich habe Visual Studio Code verwendet, um Node auf Port 3500 auszuführen, und ich verwende Git Bash Shell in VS-Code. Ich war mit Ctrl + C graziös beendet, aber manchmal tötet es das nicht. Ich möchte meinen Port nicht ändern oder neu starten, so dass dies funktioniert hat. Hoffentlich hilft es anderen. Ansonsten ist es eine Dokumentation für mich.
Ich hatte kürzlich das gleiche Problem.
Dies bedeutet, dass der Port bereits von einer anderen Anwendung verwendet wird (Express oder andere Software).
In meinem Fall hatte ich versehentlich Express auf zwei Terminals ausgeführt. Das Beenden des Terminals mit 'Strg + C' behebte die Dinge für mich. (Server nur von einem Terminal aus ausführen)
Hoffe, es hilft anderen.
EADDRINUSE bedeutet, dass der Port Ihrer nodejs-App bereits verwendet wird.
lsof -i tcp: 3000
töte -9 Prozess-ID
In meinem Fall verwende ich ein Webhosting, aber es ist im lokalen Host das gleiche, das ich verwendet habe:
ps -aef | grep 'node'
für die Überwachung des Knotenprozesses zeigt die Konsole dann den Prozess mit PID . an, um den Prozess zu beenden, den Sie mit diesem Befehl verwenden müssen:
kill -9 PID
dabei ist PID die Prozess-ID aus dem obigen Befehl.
Ich würde es lieber machen
killall -15 node
weil kill -15
dem Prozess die Möglichkeit gibt, sich selbst zu säubern . Jetzt können Sie dies mit überprüfen
ps aux | grep node
Hinweis: Wenn Sie dem Prozess nicht die Möglichkeit geben, die gerade durchgeführten Aktionen zu beenden und zu bereinigen, kann dies zu beschädigten Dateien führen
lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID
kill PID
ex: kill 129393
Zwei Server können nicht denselben Port abhören. Prüfen Sie also, ob andere Server denselben Port überwachen, und überprüfen Sie auch die Browsersynchronisierung, wenn derselbe Port ausgeführt wird
Der Fehler EADDRINUSE
(Adresse bereits verwendet) meldet, dass auf dem lokalen System bereits ein anderer Prozess vorhanden ist, der diese Adresse/diesen Port belegt.
Es gibt ein npm-Paket namens find-process , das hilft, den Belegungsprozess zu finden (und zu schließen).
Hier ist ein kleiner Demo-Code:
const find = require('find-process')
const PORT = 80
find('port', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})
Ich habe eine kleine Probe vorbereitet, die den EADDRINUSE
-Fehler reproduzieren kann. Wenn Sie das folgende Programm in zwei separaten Terminals starten, werden Sie feststellen, dass das erste Terminal einen Server (an Port "3000") startet und das zweite Terminal den bereits laufenden Server schließt (da er die Ausführung des zweiten Terminals blockiert. EADDRINUSE
):
Minimales Arbeitsbeispiel:
const find = require('find-process')
const http = require('http')
const PORT = 3000
// Handling exceptions
process.on('uncaughtException', (error) => {
if (error.code === 'EADDRINUSE') {
find('port', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log('Shutting down blocking application...')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})
// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'})
response.write('Hello World!')
response.end()
})
server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))
Es gibt eine Möglichkeit, den Vorgang mit dem Task-Manager zu beenden:
Beachten Sie, dass diese Lösung nur für Windows ist
Rufen Sie den Task-Manager auf (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 "Task beenden").
Während Sie den NODE_PORT beenden, kann dies den Chrome-Prozess oder alles, was denselben Port abhört, unterbrechen, was ärgerlich ist.
Dieses Shell-Skript kann hilfreich sein - in meinem Fall ist der Port 1337, Sie können ihn jedoch jederzeit ändern
# LOGIC
CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`
for pid in $PORT_PIDS
do
if [[ ${CHROME_PIDS} != *$pid* ]];then
# NOT FOUND IN CHROME PIDS
echo "Killing $pid..."
ps -p "$pid"
kill -kill "$pid"
fi
done
sails lift
# OR 'node app' OR whatever that starts your node
exit
Die Option, die für mich funktioniert:
Lauf:
ps -ax | grep node
Sie bekommen so etwas wie:
8078 pts/7 Tl 0:01 node server.js
8489 pts/10 S+ 0:00 grep --color=auto node
kill -9 8078
Für Windows-Benutzer Führen Sie den folgenden Befehl im PowerShell-Fenster aus, um alle Knotenprozesse zu beenden.
Stop-Process -processname node
Windows ist bei Open Source immer schwierig.
Ändern Sie den Port einfach funktioniert es
node-inspector --web-port=8099
Dieser Fehler ist aufgetreten, als wir versehentlich zwei lokale Express-Umgebungen in derselben Instanz hatten, die auf denselben Port verweisen.
Wenn Sie so weit unten in der Liste der Antworten sind, hoffe ich, dass dies hilfreich ist und Ihr Problem löst.
Dies ist mir passiert, weil ich meinen Server in einem anderen Terminal-Fenster laufen ließ. Das Schließen der Verbindung löste das Problem.
EADDRINUSE übersetzt in "Der Port, auf dem Sie app.listen () ausgeben möchten, wird von anderen Programmen verwendet". Sie können ein solches Skript verwenden, um zu überprüfen, ob Ihr Port verwendet wird, und ändern Sie dann den Port in Ihrer app.listen ().
var net = require('net');
var errors = ['EADDRINUSE'];
var isUsed = function(port) {
var tester = net.createServer()
.once('error', function (err) {
if (!errors.includes(err.code)) {
console.log("Port is in use, change the port.");
}
})
.once('listening', function() {
tester.once('close', function() {
console.log("You are good to go.");
})
.close()
})
.listen(port);
}
Sie können weitere Fehler im Fehlerfeld hinzufügen, um auch alle möglichen Fehlertypen zu überprüfen.