it-swarm.com.de

Fehlerbehebung: Hören Sie EADDRINUSE, während Sie nodejs verwenden.

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();
377
Danny Fox

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);
367
stewe

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.

472
Patrick

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. 

235
Nobita

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

Turn off Skype port 80 usage

57
Rob Evans

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    
33
Yaki Klein

pkill node sollte vor der Ausführung des Skripts ausgeführt werden.

15
Javier Cobos

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
15
ranjith

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.

14
Evan Carroll

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

13
hientrq

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.

  1. Freie aktuell verwendete Portnummer
  2. Wählen Sie eine andere Portnummer für Ihr aktuelles Programm


1. Freie Portnummer

Windows

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

 enter image description here

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


2. Portnummer ändern?

Windows

set PORT=5000

Mac

export PORT=5000
11
WasiF

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.

schritt 1:

$Sudo netstat -plunt |grep :3000

Dass der obige Befehl unten ergibt.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

schritt 2:

Jetzt haben Sie die Prozess-ID (25315). Diesen Prozess beenden. 

kill -9 25315

schritt 3:

npm run start

Hinweis: Diese Lösung für Linux-Benutzer.

8
thavaamm

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 
4
Anupam Maurya

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

4
WAQAR SHAIKH

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
3
Parth Vyas

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.

3
robinclark007

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.

2
ControlAltDel

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 

2
Khurram Ijaz

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;

  1. Sie können es mit Sudo lsof -i tcp:8080 überprüfen.
  2. Wenn ja, und Sie möchten Jenkins nur einmal anhalten, führen Sie Folgendes aus: Sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
2
Chotala Paresh

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.

2
Birol Efe

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 

  1. Öffnen Sie Ihren Task-Manager
  2. Klicken Sie auf der Registerkarte "Prozesse" mit der rechten Maustaste auf Name oder eine Spalte, und wählen Sie die PID aus
  3. Nach PID sortieren, mit der rechten Maustaste auf die rechte PID klicken und Task beenden anklicken.

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. 

1
Tom Stickel

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.

1
Rahul Makhija

EADDRINUSE bedeutet, dass der Port Ihrer nodejs-App bereits verwendet wird.

  • Jetzt müssen Sie den Prozess/die Anwendung beenden, die auf diesem Port ausgeführt wird.
  • Suchen Sie nach der Prozess-ID der App: 

lsof -i tcp: 3000

  • Jetzt erhalten Sie die Prozess-ID.
  • Führen Sie das aus:

töte -9 Prozess-ID

1

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.

1
Jorge Mejia

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 

1
Smshrimant
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
1
Pramod Jain

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

1
blackHawk

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}"...`))
1

Es gibt eine Möglichkeit, den Vorgang mit dem Task-Manager zu beenden:

Beachten Sie, dass diese Lösung nur für Windows ist

  1. Rufen Sie den Task-Manager auf (oder verwenden Sie die Verknüpfung) Ctrl + Shift + Esc)

  2. 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").

enter image description here

  1. Jetzt solltest du wieder anfangen können
1
Jee Mok

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
1
Nizar Blond

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
1
prakash tank

Für Windows-Benutzer Führen Sie den folgenden Befehl im PowerShell-Fenster aus, um alle Knotenprozesse zu beenden.

Stop-Process -processname node
0
rawel

Windows ist bei Open Source immer schwierig.

Ändern Sie den Port einfach funktioniert es

node-inspector --web-port=8099
0
Ignatius Andrew

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. 

0

Dies ist mir passiert, weil ich meinen Server in einem anderen Terminal-Fenster laufen ließ. Das Schließen der Verbindung löste das Problem.

0
cocomatt

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.

0