539 Stimmen

Wie behebt man den Fehler: listen EADDRINUSE bei der Verwendung von NodeJS?

Wenn ich einen Server mit dem Port 80 betreibe und versuche, die XMLHttpRequest Ich erhalte diesen Fehler: Error: listen EADDRINUSE

Warum ist es ein Problem für NodeJS, wenn ich eine Anfrage stellen möchte, während ich einen Server auf dem Port 80 laufen lasse? Für die Webbrowser ist es 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();

644voto

Patrick Punkte 6417

Was mir wirklich geholfen hat, war:

killall -9 node

Dies wird jedoch einen Systemprozess beenden.

Con

ps ax

können Sie überprüfen, ob es funktioniert hat.

432voto

stewe Punkte 40156

EADDRINUSE bedeutet, dass die Portnummer, die listen() versucht, den Server zu binden, wird bereits verwendet.

In Ihrem Fall muss also bereits ein Server auf Port 80 laufen.

Wenn Sie einen anderen Webserver auf diesem Port laufen haben, müssen Sie node.js hinter diesen Server stellen und über ihn projizieren.

Sie sollten prüfen, ob die listening Ereignis wie dieses, 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);

313voto

Aurelio Punkte 22324

Die vorgenannten killall -9 node Die von Patrick vorgeschlagene Methode funktioniert wie erwartet und löst das Problem, aber Sie sollten vielleicht den Abschnitt "Bearbeiten" in dieser Antwort lesen, der erklärt, warum kill -9 ist vielleicht nicht der beste Weg, dies zu tun.

Darüber hinaus sollten Sie vielleicht eine einzeln als blindes Töten alle aktive Prozesse.

In diesem Fall ermitteln Sie zunächst die Prozess-ID (PID) des Prozesses, der an diesem Anschluss läuft (z. B. 8888):

lsof -i tcp:8888

Dies ergibt etwas wie:

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 darüber lesen aquí .

EDIT。 Ich habe heute über ein verwandtes Thema gelesen und bin dabei auf diesen interessanten Thread gestoßen warum sollte ich nicht kill -9 ein Verfahren .

Im Allgemeinen sollten Sie töten -15 vor töten -9 um dem Zielprozess die Chance zu geben, sich selbst zu bereinigen. (Prozesse können SIGKILL nicht abfangen oder ignorieren, aber sie können SIGTERM abfangen und tun es oft). Wenn Sie dem Prozess keine Chance geben, seine Arbeit zu beenden und aufzuräumen, kann er beschädigte Dateien (oder andere Zustände) hinterlassen, die er nach dem Neustart nicht mehr verstehen kann.

Wie bereits erwähnt, sollten Sie den obigen Prozess also besser mit beenden:

kill -15 57385

EDIT 2 : Wie in einem Kommentar hier vermerkt In vielen Fällen ist dieser Fehler eine Folge des nicht ordnungsgemäßen Beendens eines Prozesses. Das heißt, viele Leute beenden einen Node-Befehl (oder einen anderen) mit STRG+Z . Der korrekte Weg, einen laufenden Prozess zu stoppen, ist die Eingabe des Befehls STRG+C Befehl, der einen sauberen Exit durchführt.

Wenn Sie einen Prozess auf die richtige Art und Weise beenden, wird der Anschluss beim Herunterfahren frei. Auf diese Weise können Sie den Prozess neu starten, ohne ihn erst selbst beenden zu müssen, bevor Sie ihn erneut starten können.

63voto

Rob Evans Punkte 6464

Nur als Vorwarnung: Skype lauscht manchmal an Anschluss 80 und verursacht daher diesen Fehler, wenn Sie versuchen, von Node.js oder einer anderen Anwendung aus an Anschluss 80 zu lauschen.

Sie können dieses Verhalten in Skype deaktivieren, indem Sie in den Optionen auf Erweitert -> Verbindung -> Anschluss 80 verwenden klicken (deaktivieren).

Turn off Skype port 80 usage

P.S. Vergessen Sie nicht, Skype neu zu starten, nachdem Sie diese Änderung vorgenommen haben!

45voto

Yaki Klein Punkte 3152

Sie sollten versuchen, den Prozess zu beenden, der auf Port 80 lauscht.

Killall beendet alle laufenden Knotenanwendungen. Das möchten Sie vielleicht nicht tun. Mit diesem Befehl können Sie nur die eine Anwendung beenden, die an einem bekannten Port lauscht.

Wenn Sie Unix verwenden, versuchen Sie diesen Befehl:

sudo fuser -k 80/tcp

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X