Jeśli uruchomię serwer z portem 80 i spróbuję użyć polecenia xmlHTTP, otrzymuję ten błąd:Error: listen EADDRINUSE
Dlaczego jest to problem dla nodejs, jeśli chcę zrobić żądanie, gdy uruchamiam serwer na porcie 80? Dla przeglądarek internetowych to nie problem: mogę surfować po Internecie, gdy serwer jest uruchomiony.
Serwer to:
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort;
console.log('connection request from: ' + socket.remoteAddress);
socket.destroy();
}).listen(options.port);
I prośba:
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
źródło
źródło
Odpowiedzi:
EADDRINUSE
oznacza, że numer portu, którylisten()
próbuje powiązać serwer, jest już w użyciu.Tak więc, w twoim przypadku, musi być już uruchomiony serwer na porcie 80.
Jeśli masz inny serwer WWW działający na tym porcie, musisz umieścić node.js za tym serwerem i przez niego proxy.
Powinieneś sprawdzić takie
listening
zdarzenie, aby zobaczyć, czy serwer naprawdę nasłuchuje:źródło
To, co naprawdę mi pomogło, to:
Ale to zabije proces systemowy.
Z
możesz sprawdzić, czy zadziałało.
źródło
ps aux | grep node
pokaże to. Zamiast zabijać aplikację z Ctrl + Z , zamknąć aplikację z Ctrl + C . Spowoduje to zamknięcie aplikacji z wdziękiem i powiązanie portu zostanie usunięte.Wyżej wspomniane
killall -9 node
, sugerowane przez Patricka, działa zgodnie z oczekiwaniami i rozwiązuje problem, ale możesz przeczytać część edycyjną tej odpowiedzi na pytanie, dlaczegokill -9
może nie być najlepszym sposobem na zrobienie tego.Ponadto możesz kierować jeden proces, a nie ślepo zabijać wszystkich aktywne procesy.
W takim przypadku najpierw uzyskaj identyfikator procesu (PID) procesu uruchomionego na tym porcie (powiedzmy 8888):
lsof -i tcp:8888
Zwróci to coś w rodzaju:
Następnie po prostu zrób (ps - właściwie nie . Proszę czytaj dalej poniżej):
kill -9 57385
Możesz przeczytać więcej na ten temat tutaj .
EDYCJA: Czytałem dziś dość pokrewny temat i natknąłem się na ten interesujący wątek, dlaczego nie powinienem być
kill -9
procesem .Jak już wspomniano, lepiej zabić powyższy proces za pomocą:
kill -15 57385
EDYCJA 2 : Jak zauważono w komentarzu tutaj wielokrotnie, ten błąd jest konsekwencją nie opuszczenia procesu z gracją. Oznacza to, że wiele osób zakończyć polecenie węzła (lub innych) za pomocą CTRL + Z . Prawidłowym sposobem zatrzymania uruchomionego procesu jest wydanie polecenia CTRL + C, które wykonuje czyste wyjście.
Właściwe wyjście z procesu zwolni ten port podczas zamykania. Pozwoli to na ponowne uruchomienie procesu bez kłopotania się z jego zabiciem, zanim będzie można go ponownie uruchomić.
źródło
pgrep node
pokazuje, czy jakikolwiek proces węzłowy uciekł.pkill node
zabije ich.Tylko głowa do góry, Skype czasami nasłuchuje na porcie 80 i dlatego powoduje ten błąd, jeśli spróbujesz nasłuchiwać na porcie 80 z Node.js lub innej aplikacji.
Możesz wyłączyć to zachowanie w Skype, otwierając opcje i klikając Zaawansowane -> Połączenie -> Użyj portu 80 (Odznacz to)
źródło
Powinieneś spróbować zabić proces nasłuchujący na porcie 80.
Killall zabije wszystkie uruchomione aplikacje węzłów. Możesz tego nie chcieć. Za pomocą tego polecenia możesz zabić tylko jedną aplikację, która nasłuchuje na znanym porcie.
Jeśli używasz Uniksa, wypróbuj to polecenie:
źródło
Dwa możliwe rozwiązania dla Windows / Mac
1. Darmowy numer portu
Windows
Prochowiec
Możesz spróbować netstat
Dla OSX El Capitan i nowszych (lub jeśli twój netstat nie obsługuje -p), użyj lsof
jeśli to nie rozwiąże problemu,
Mac
użytkownicy mogą zapoznać się z pełną dyskusją na ten temat Znajdź (i zabij) proces blokowania portu 3000 na komputerze Mac2. Zmienić numer portu?
Windows
Prochowiec
źródło
netstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Pod env kontrolera możesz użyć:
pkill node
przed uruchomieniem skryptu należy wykonać zadanie.Pamiętaj, że to polecenie zabije wszystkie
node
procesy, co może być słuszne, jeśli masz np. Kontener z tylko jedną instancją, a my masz taką env, w której możesz to zagwarantować.W każdym innym scenariuszu zalecam użycie polecenia, aby zabić określony identyfikator procesu lub nazwę, którą znalazłeś, szukając go programowo. na przykład jeśli twój proces jest nazywany, węzeł-serwer-1 możesz zrobić
pkill node-server-1
.Ten zasób może być przydatny do zrozumienia: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/
źródło
pgrep node
przed ręką, jeśli chcesz być trochę ostrożny i zobaczyć, jakienode
procesy są uruchomioneTwoja aplikacja działa już na tym porcie 8080. Użyj tego kodu, aby zabić port i ponownie uruchomić kod
źródło
kill -9
jest prawie na pewno przesadzone i, moim zdaniem, okropna rada, której można udzielić bez konkretnych ostrzeżeń o to. Wystarczykill
prawdopodobnie rade, a tak naprawdę, podstawowym problemem w tej kwestii jest, jak sądzę, że próbują, aby ponownie uruchomić serwer w kółko, więc jest to tylko hack, a nie dylemat. Muszą lepiej zrozumieć, co się dzieje, czego tak naprawdę nie zapewnia ta odpowiedź.Inną rzeczą, która może powodować ten błąd, są dwa serwery HTTP w tym samym kodzie węzła. Zaktualizowałem trochę kodu Express 2 do Express 3 i miałem to ...
I spowodował ten błąd.
źródło
To działa dla mnie (używam Maca). Uruchom to polecenie
lsof -PiTCP -sTCP:LISTEN
Spowoduje to wyświetlenie listy portów używanych przez twój system. Znajdź
PID
działający węzełi biegnij
kill -9 [YOUR_PID]
źródło
EADDRINUSE
oznacza, że port (który próbujemy nasłuchiwać w aplikacji węzła) jest już używany. Aby temu zaradzić, musimy określić, który proces działa z tym portem.Na przykład, jeśli próbujemy nasłuchiwać aplikacji węzła w porcie 3000. Musimy sprawdzić, czy ten port jest już używany przez inny proces.
krok 1:
Że powyższe polecenie daje wynik poniżej.
krok 2:
Teraz masz identyfikator procesu (25315), Zabij ten proces.
krok 3:
Uwaga: To rozwiązanie dla użytkowników Linuksa.
źródło
źródło
za zabicie siłą
użyj powyżej cmd, aby zabić określony port, a następnie uruchom serwer
źródło
Spróbuj obu poleceń, a zatrzyma cały proces węzła.
źródło
Ten błąd pojawia się, gdy na porcie, na którym chcesz uruchomić aplikację, działa dowolny proces.
jak uzyskać, który proces działa na tym porcie => polecenie: sudo netstat -ap | grep: 3000
wyjście: otrzymasz informacje o procesie, który używa tego portu
tcp 0 0 Adres IP: 3000 : Adres IP LISTEN 26869 / node
Teraz możesz zabić ten proces sudo kill -9 26869
źródło
W poniższym poleceniu zastąp numer portu
źródło
EADDRINUSE oznacza, że port Twojej aplikacji nodejs jest już w użyciu.
źródło
Istnieje sposób na zakończenie procesu za pomocą Menedżera zadań:
Przejdź do Menedżera zadań (lub użyj skrótu Ctrl+ Shift+ Esc)
W „Procesach w tle” znajdź procesy „Node.js” i zakończ je (kliknij je prawym przyciskiem myszy i wybierz „Zakończ zadanie”)
źródło
Widziałem ten błąd wcześniej (w węźle) w http.client i, jak pamiętam, problem dotyczył braku inicjowania httpClient lub ustawiania złych opcji w tworzeniu httpClient i / lub w żądaniu adresu URL.
źródło
Mam również ten sam problem, po prostu zamykam terminal, otwieram nowy terminal i uruchamiam
jeszcze raz. to działa dla mnie, trochę czasu wystarczy poczekać kilka sekund, aż znowu zadziała.
Ale działa to tylko na komputerze dewelopera zamiast na konsoli serwera.
źródło
Błąd: Listen EADDRINUSE oznacza, że port, który chcesz przypisać / powiązać z serwerem aplikacji, jest już zajęty . Możesz przypisać inny port do swojej aplikacji.
Lub jeśli chcesz przypisać ten sam port do aplikacji. Następnie zabij aplikację działającą na wybranym porcie.
W przypadku aplikacji węzłowej możesz spróbować znaleźć identyfikator procesu dla aplikacji węzłowej poprzez:
Po uzyskaniu identyfikatora procesu zrób
źródło
W Debianie dowiedziałem się, że działa na porcie 80, musisz wydać polecenie jako root, tj
Mam nadzieję, że to pomoże
źródło
W moim przypadku serwer HTTP Apache działał na porcie 80. Rozwiązałem go, wydając polecenie jako root
sudo killall httpd
Aktualizacja
Jeśli Jenkin jest zainstalowany i działa na komputerze Mac;
sudo lsof -i tcp:8080
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
źródło
Wydaje się, że jest uruchomiony inny proces obsługi węzła Node ng. Sprawdź to, wpisując to w konsoli (Linux / Mac):
i wyjdź z:
LUB użycie alternatywne
aby obsłużyć swój projekt na dowolnym wolnym porcie.
źródło
Zabijając NODE_PORT, może zabić twój proces chrome lub cokolwiek, co nasłuchuje na tym samym porcie, co jest denerwujące.
Ten skrypt powłoki może być pomocny - w moim przypadku port to 1337, ale możesz go zmienić w dowolnym momencie
źródło
W moim przypadku korzystam z hostingu, ale tak samo jest z hostem lokalnym, użyłem:
aby następnie obejrzeć proces węzła, konsola pokazuje proces z PID. aby zabić proces, musisz użyć tego polecenia:
gdzie PID jest identyfikatorem procesu z powyższej komendy.
źródło
Dwa serwery nie mogą nasłuchiwać na tym samym porcie, więc sprawdź, czy inny serwer nasłuchuje na tym samym porcie, a także sprawdź synchronizację przeglądarki, jeśli działa na tym samym porcie
źródło
Dla innych osób w
localhost
systemie Windows 10 z węzłem as i działającym na porcie takim jak 3500, a nie 80 ...Co nie działa:
Co pokazuje informacje, ale nadal nie działa:
Co działa:
Git Bash lub Powershell w systemie Windows
Zauważ PID (skrajnie prawy),
że nie mogłem dostać się
killall
do pracy ... więcTeraz po tym niezbyt przyjemnym ćwiczeniu w systemie Windows zdałem sobie sprawę, że mogę użyć menedżera zadań, znaleźć silnik Node i po prostu go zakończyć.
Do twojej wiadomości, użyłem Visual Studio Code do uruchomienia Node na porcie 3500 i używam powłoki Git Bash wewnątrz kodu VS. Opuściłem z wdziękiem Ctrl + C, ale czasem to nie zabija. Nie chcę zmieniać portu ani restartować, więc to zadziałało. Mam nadzieję, że pomaga innym. W przeciwnym razie jest to dokumentacja dla mnie.
źródło
W systemie Windows użytkownicy wykonują następujące polecenie w oknie programu PowerShell, aby zabić wszystkie procesy węzłów.
źródło
Opcja, która działa dla mnie:
Biegać:
Dostaniesz coś takiego:
źródło