Port Node.js 3000 jest już używany, ale w rzeczywistości nie jest?

118

Pracuję nad projektem node.js od kilku tygodni i działa świetnie. Zwykle używam npm startdo uruchamiania aplikacji i przeglądania jej w przeglądarce na serwerze lokalnym, port 3000.

Dzisiaj zacząłem otrzymywać następujący błąd podczas korzystania z npm start:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

Sprawdziłem monitor zasobów i nie mam innego procesu uruchomionego na porcie 3000. Dlaczego otrzymuję ten komunikat o błędzie?

W moim app.js mam następujący kod do ustawienia portu ... czy to jest nieprawidłowe? Wcześniej działało dobrze, więc nie jestem pewien, co robię źle.

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

Dzięki za pomoc!


EDYTOWAĆ:

Próbowałem uruchomić netstat i TCPView, aby sprawdzić, który proces używa portu, ale nic nie używa tego portu. Próbowałem też zrestartować laptopa, ale nadal pojawia się ten sam błąd.

user2573690
źródło
Jest jeszcze jeden proces, który korzysta z tego portu, to pewne. Który system operacyjny próbujesz? Możesz to
wygooglować w stylu ``
1
czy próbowałeś stackoverflow.com/questions/48198/…
Izaak
1
Ikona ulubionych zostanie zapisana w pamięci podręcznej. Możesz także spróbować netstatw wierszu poleceń lub połączyć się z localhost: 3000 za pomocą odpowiednika telnetu - na przykład PuTTY.
Blorgbeard wychodzi
5
Zauważyłem, że po komunikacie „Serwer uruchomiony na porcie 3000” pojawia się komunikat „Port 3000 jest już używany” - czy coś w Twojej aplikacji próbuje ponownie rozpocząć nasłuchiwanie na tym samym porcie?
Blorgbeard wychodzi
7
Domyślam się, że masz dwie app.listen()instrukcje w swojej aplikacji na innej, .listen()która również próbuje uruchomić serwer na tym porcie. Pierwsza działa, druga zgłasza błąd. Wyszukaj w swoim kodzie .listen.
jfriend00

Odpowiedzi:

273

Możesz szukać, jak zabić ten proces.

W przypadku systemu Linux / Mac OS wyszukaj (sudo) runto w terminalu:

$ lsof -i tcp:3000
$ kill -9 PID

W systemie Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

zmiana tskillna taskkillw git bash

Animesh Singh
źródło
2
Wypróbowałem wiele innych rozwiązań w systemie Windows, ale ten znalazł dziwny proces, który zapychał port. Zdobył uznanie za włączenie również podejścia linuxowego oprócz pracy w systemie Windows.
truedat101
2
tskill nie działa dla mnie w systemie Windows. taskkill / F / PID myPIDhere - to działa
snersesyan
2
Nic nie dostaję tylko lsofz sudo lsof czymś, ale coś dostaję, a zabicie tego procesu rozwiązało problem.
user985366
Czy istnieje sposób na dynamiczne pobranie PID dla uruchomionego procesu i zabicie go? Z jakiegoś powodu muszę to robić za każdym razem, gdy wdrażam, aby ręcznie produkować. Uwaga boczna, pewnie, czy jest to związane z PM2, czy nie.
S_W
taskkill nie działał dla mnie na git-bash, ale tskill tak. dzięki.
nickcamillo
36

Czasami tak się dzieje, jak zaproponowała @sova. Czasami mi się to zdarza, gdy używany jest EADDR . Zazwyczaj w tle ukrywa się okno terminala, na którym nadal działa aplikacja. I to też jest w porządku ze mną.

Zdarza się, że kiedy otwierasz terminal przez długi czas, tak, masz rację, zatrzymałeś proces. Ale czasami nie zatrzymywał się w tle. Najlepszym rozwiązaniem jest więc zamknięcie terminala i ponowne uruchomienie. To rozwiąże Twój problem. bo w moim przypadku to działa.

Również,

sudo lsof -i:<PORT_NO>

zamknij instancję na chwilę obecną, ale nie możesz zatrzymać procesu w tle. Więc raz,

sudo kill <PID>

działa, ale ponownie, gdy zaktualizujemy nasz kod i zapiszemy, ten problem pojawia się ponownie, tak jak w przypadku Nodemon .

Wyjście z terminala rozwiąże problem. LUB

  killall -9 node
techyaura
źródło
2
Ani lsof, ani netstat nic nie zwróciły, ale nadal wydawało się, że jakiś proces używa portu. Po tym, killall -9 nodejak mogłem uruchomić serwer lokalnie.
Julsteri
dzięki za polecenie killall -9 node. działało na goorm IDE
ifhy
32

Może możesz wziąć to jako odniesienie. Ta pojedyncza linia poleceń może zabić proces działający na danym porcie.

npx kill-port 3000

wprowadź opis obrazu tutaj


Zabić wiele portów.

npx kill-port 3000 8080 4200
Penny Liu
źródło
1
to zadziałało jak urok, dzięki
Aditya Patnaik
22

W przypadku systemu Windows Menedżer zadań z pewnością pokaże uruchomiony proces węzła. Spróbuj zabić proces, to rozwiąże problem.

PRAKASH THOMAS VARGHESE
źródło
22

Miałem ten sam problem. (Poniższe kroki działają dobrze w systemie Windows 10):

  1. Otwórz Menedżera zadań (naciśnij Ctrl+ Alt+ Delete)
  2. Wybierz kartę „Procesy”
  3. Wyszukaj „Node.js: JavaScript po stronie serwera”
  4. Wybierz go i kliknij przycisk „Zakończ zadanie”

Teraz możesz biec npm start.

Mam nadzieję, że ci to pomoże.

Mahyar
źródło
8

Widziałem to samo i wypróbowałem wszystkie powyższe sugestie bez powodzenia. Oto kroki, które rozwiązują to dla mnie: - wyłącz wifi - start npm (to powinno działać) - włącz wifi

Nie jestem do końca pewien, na czym polega problem główny, ale to rozwiązało go dla mnie.

James Smith
źródło
Po prostu mi się to przydarzyło. netstat -anonie wymieniał niczego przy użyciu portu 3000.
Nathan
1
Do diabła, to również rozwiązało problem, ponieważ oczywiście nic nie działało na porcie 3000. Zacząłem mieć ten problem po aktualizacji systemu Windows. Nigdy nie myślałem o wyłączaniu Wi-Fi. Dziękuję za rozwiązanie tego problemu :)
3Dos
7

Używałem serwera ekspresowego z nodemonem na NodeJS. Otrzymałem następujący komunikat i wygląda na to, że jest to błąd:

$ node ./bin/www
Port 3000 is already in use

Istnieje ogólne rozwiązanie, które polega na zakończeniu wszystkich połączeń z serwerem węzłów, można dodać ten kod do pliku package.json:

"scripts": {
    "start": "node ./bin/www",
    "stop": "taskkill -f -im node.exe"
},

Ponadto znalazłem kilka rozwiązań poleceń Windows i bash na Win 10 x64.

Wszystkie moje notatki są tutaj:


# Zakończ wszystkie połączenia z serwerem NodeJS

$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.

# Przykład: Otwórz Menedżera zadań Windows i zobacz numer PID „node.exe” w systemie Windows

>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano

# Zabij proces w systemie Windows według numeru portu (przykład)

O pomoc:

$ taskkill /?
$ tskill /?

Kod 1:

$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

Kod 2:

$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.

Kod 3:

$ tskill 14228

# Linia poleceń do patrzenia na określony port

w cmd:

$ netstat -ano | find "14228"

w bash:

$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228

# Znajdź node.exe za pomocą polecenia „tasklist”

w cmd:

$ tasklist | find "node"

w bash:

$ tasklist | grep node
$ tasklist | grep node.exe
node.exe                     14228 Console                    2     48,156 K
node.exe                     15236 Console                    2     24,776 K
node.exe                     19364 Console                    2     24,428 K
aygunyilmaz
źródło
7

Zabicie procesu, który jest właścicielem portu 3000

Najpierw przyjrzyjmy się, jak możemy zabić proces, który ma otwarty port.

Za pomocą polecenia lsof możemy pobrać PID, który ma dany port:

$ lsof -i :3000 -t
12345

Następnie możemy zabić ten proces, wykonując:

$ kill 12345

Zmieńmy to w jedną linijkę:

lsof -i 3000 -t | xargs kill

Jeśli używasz zmiennej środowiskowej do ustawiania portu serwera, możemy to określić zamiast zakodować na stałe nasze wartości:

lsof -i ${PORT} -t | xargs kill

Na koniec możemy domyślnie ustawić port 3000, jeśli zmienna środowiskowa nie jest ustawiona:

lsof -i ${PORT:-3000} -t | xargs kill

Pobranie nodemona do wykonania przechwyceń

Nodemon umożliwia konfigurowanie podpięć zdarzeń za pośrednictwem pliku konfiguracyjnego nodemon.json:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

To spowoduje, że nodemon wykona sh -c 'lsof -i:${PORT:-3000} -t | xargs kill za każdym razem, gdy aplikacja ulegnie awarii, zabijając w ten sposób proces potomny, który utworzył, który utrzymuje otwarty port.

lub możesz spróbować tego

fuser -k PORT-NO/tcp

na przykład:

fuser -k 3000/tcp
Afeesudheen
źródło
To całkiem ładne i czyste rozwiązanie do zabijania procesu. Muszę za każdym razem sprawdzić, jak to zrobić, a to najmilsze rozwiązanie, jakie do tej pory widziałem!
twknab
lsof -i :3000 -t
Mam
@xaunlopez spróbuj tego fuser -k port-number/tcp
Afeesudheen
5

Czasami mi się to zdarza, gdy używany jest EADDR. Zazwyczaj w tle ukrywa się okno terminala, na którym nadal działa aplikacja. Możesz zatrzymać proces za pomocą ctrl + C w oknie terminala.

A może wielokrotnie słuchasz portu z powodu copy / pasta =)

sova
źródło
Dzięki za pomoc! Nie mam otwartych innych okien terminala, cokolwiek jeszcze powinienem sprawdzić?
user2573690
znajdź dowolny węzeł lub proces npm i zakończ go. jeśli nadal masz funk, zrestartuj komputer lub po prostu wybierz inny port do pracy. Tam naprawdę nie ma powodu, to musi być portem 3000 lub 8080
Sova
Właśnie utworzyłem nową aplikację węzła i uruchomiłem ją na porcie 3000 i wydaje się, że działa dobrze, ale kiedy próbuję uruchomić istniejący projekt, pojawia się komunikat, że port jest używany. Czy kiedykolwiek miałeś ten problem?
user2573690
@ user2573690 Nie spotkałem się z tym wcześniej, ale może masz wiele plików js (takich jak app.js i index.js), z których jeden dzwoni .listen()wiele razy?
sova
2
Dziękuję Ci! Udało mi się to rozgryźć, wielokrotnie nasłuchiwałem portu, przypadek kopiowania / makaronu! Jeśli możesz edytować swoją odpowiedź i dodać ten fragment, zaznaczę go. Jeszcze raz dziękuję!
user2573690
5

Otwórz Menedżera zadań (naciśnij Ctrl + Alt + Del Wybierz zakładkę „Procesy” Wyszukaj „Node.js: JavaScript po stronie serwera” Wybierz go i kliknij przycisk „Zakończ zadanie”

Omar bakhsh
źródło
2

Pochodzi z Google tutaj z rozwiązaniem dla High Sierra.

Coś się zmieniło w konfiguracji sieci w macOS i niektórych aplikacjach (w tym ping) nie może rozwiązać localhost.

Edycja / etc / hosts wydaje się być poprawką:

cmd: sudo nano /etc/hosts/ zawartość127.0.0.1 localhost

Lub po prostu (jeśli jesteś pewien, że twój / etc / hosts jest pusty) sudo echo '127.0.0.1 localhost' > /etc/hosts

sznowicki
źródło
2

Spędziłem 2 EADDRINUSEgodziny na ustaleniu, dlaczego nie pozwoliłem mi sartować aplikacji (inne serwery node-express były w porządku) ... zaczęło działać po dodaniu lazyConnect: true, do konfiguracji źródła danych.

Nie pytaj mnie, dlaczego to pomogło. Nie wiem. Umieszczam tutaj te informacje tylko dla osób, które mają ten sam problem.

test30
źródło
głosowano za chęcią pomocy ORAZ rozwiązanie, które może pomóc w znalezieniu pierwotnej przyczyny.
Titou,
2

Mam ten problem, używając Git Bash w systemie Windows. Biegam npm startlub node app.js. Po zamknięciu go krótko Ctrl + C i ponownej próbie uruchomienia serwera za pomocą npm startlubnode app.js pojawia się ten komunikat o błędzie.

Jednak gdy robię to za pomocą zwykłego wiersza polecenia systemu Windows , działa dobrze.

Lub możesz to zrobić w inny sposób. Otwórz Menedżera zadań i znajdź wiersz „ Node.js: JavaScript po stronie serwera ”. Wybierz to i zakończ zadanie . Teraz powinno działać.

Dzięki.

Amanullah Aman
źródło
2

Jeśli chcesz zamknąć tylko jeden port, po prostu uruchom to polecenie. kill -9 $(lsof -t -i:3000)

Różnica między pkillikill czy ktoś przetwarza glinę. Zabijając stosujesz filtr. po prostu zatrzymaj żądany port.

pkillRozkaz zamknięcie wszystkich procesów węzłów. pkill -9 node

Użyj pkill, aby uniknąć wycieków pamięci, które występują sporadycznie podczas programowania. jeśli jest więcej niż jeden węzeł, zabija je wszystkie.

Zilustrowano również użycie skryptów w package.json .

"scripts": {
    "server:start": "cd server && yarn start",
    "server:restart": "cd server && yarn restart",
    "frontend:start": "cd frontend && yarn start",
    "frontend:restart": "kill -9 $(lsof -t -i:4200) && yarn start:frontend"
},
"scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts",
    "restart": "pkill -9 node && start",
    "kill": "pkill -9 node"
},
umutyerebakmaz
źródło
1

Spróbuj otworzyć localhost w przeglądarce. Wystarczy wpisać: localhost:3000w pasku adresu.

Jeśli aplikacja się otwiera, oznacza to, że poprzednianpm run jest nadal aktywna. Teraz możesz po prostu wprowadzić zmiany w kodzie i zobaczyć efekty, jeśli projektujesz tę samą aplikację, lub jeśli chcesz uruchomić inną aplikację, po prostu popraw kod (w index.js poprzednio uruchomionej aplikacji) i ( prawdopodobnie odśwież kartę przeglądarki), aby się zawiesić;) ..... Teraz uruchom npm run startponownie z nowego katalogu aplikacji. Mam nadzieję że to pomoże! :)

lub

Możesz otworzyć Menedżera zadań (WINDOWS_KEY + X> Menedżer zadań), a zobaczysz wiersz „Node.js: JavaScript po stronie serwera”. Wybierz to i zakończ zadanie .... Powinno działać teraz !!



Jeśli nie, zmień .envplik aplikacji, aby uwzględnić port:3002i uruchomić nową aplikację. Umożliwi to uruchomienie dwóch oddzielnych aplikacji na różnych portach. Twoje zdrowie!!

Mohit Singh
źródło
1

W przypadku użytkownika systemu Windows wystarczy po prostu zatrzymać wszystkie procesy Node.js w Menedżerze zadań

Mam nadzieję, że to pomoże

Muhammad Ashfaq
źródło
1

Proste w Linuksie

  • Otwórz terminal
  • Wolny port z procesów -> kill $ (lsof -t -i: $ port)
Oben Desmond
źródło
1

Napotkałem też ten sam problem. Najlepszym sposobem rozwiązania tego problemu jest (dla systemu Windows) :

  1. Przejdź do Menedżera zadań .

  2. Przewiń i znajdź proces zadania o nazwie. Node.js: JavaScript po stronie serwera Obraz dodany w celach informacyjnych

  3. Zakończ to konkretne zadanie.

Proszę bardzo! Teraz uruchom npm i będzie działać jak poprzednio!

Daim_Nickel_Penny
źródło
0

Użytkownicy systemu Windows mogą użyć narzędzia CurrPorts , aby łatwo zabić używane porty

wprowadź opis obrazu tutaj

Zuhair Taha
źródło
0

Może to być proces administratora działający w tle i netstatnie pokazuje tego.
Użyj, tasklist | grep nodeaby znaleźć PID tego procesu administracyjnego, a następniekill PID

tnoel999888
źródło
0

jeśli korzystasz z burzy internetowej, upewnij się, że domyślny port to nie 3000 z pliku -> ustawienia -> Kompilacja, wykonanie, wdrożenie -> Debugger I tam zmień

Wbudowany port serwera

i ustaw go na „63342” lub zobacz tę odpowiedź Zmień port WebStorm LiveEdit (63342)

Muhammad Saleh
źródło
0

W skryptach package.json znajdują się:

"start": "nodemon app.js --delay 1500ms"

Uważam, że problem dotyczył czasu, gdy stary port nie wyłączał się na czas przez nodemona do ponownego uruchomienia. Wystąpił problem podczas używania multera.

Kalkhas
źródło
Dostosuj opóźnienie zgodnie z wymaganiami.
Kalkhas
0

server lub app listen () mogą zostać dodane w 2 miejscach. Wyszukaj metody Listen () w programie dla uruchamiania aplikacji, dlatego powraca jako serwer uruchomiony na porcie XXXX, a port XXXX jest już używany.

Anoop George
źródło
0

W mojej sytuacji właśnie zacząłem używać VS Code i skorzystałem z samouczka używającego Sequelize. W końcu miałem plik bin / www, który zawierał Listen (). Nie wiedziałem o tym i uruchamiałem moją aplikację, uruchamiając node app.js, kiedy to nie działało, dodałem następnie do serwera ekspresowego z .listen () (co działało dobrze).

Ale kiedy zacząłem używać nodemona i VSCode, wskazano na bin / www, a to wymagało mojego app.js.

Krótko mówiąc, dodałem .listen () do mojego app.js i uruchamiałem app.js bezpośrednio, kiedy nie powinienem był tego dodawać i uruchamiać bin / www.

Piotr
źródło
0

W systemie Ubuntu najpierw pobierz proces, używając numeru portu: sudo lsof -i: 3000, a następnie użyj polecenia kill, aby zabić proces, na przykład jeśli PID procesu to 4493, użyj polecenia: kill 4493 , w przypadku systemu Mac lub Windows znajdź powiązane polecenie

wprowadź opis obrazu tutaj

Lord
źródło
0

Rozwiązałem ten problem, ponieważ MongoDB lub jest inna aplikacja, którą wcześniej uruchomiłeś na tym porcie, więc aby rozwiązać ten problem, zabij proces z menedżera zadań lub po prostu zmień numer portu z 3000 na inny.

Omar Abusabha
źródło
0

To jest bardzo proste. Możesz to naprawić w 2 prostych krokach.

  1. Sprawdź zmienne środowiskowe, czy istnieje klucz / pozycja o nazwie „PORT”.
  2. Jeśli zostanie znaleziony, usuń ten wpis lub zmień jego nazwę na inną.

Okazuje się, że inny program używa tej zmiennej. Zwykle po uruchomieniu skryptów reagujących będzie szukał zmiennej środowiskowej o tym tytule PORT.

Amini-Philips Ogelenye
źródło
-1

Przed uruchomieniem nodemona uruchom najpierw mongod. Nigdy nie otrzymasz tego błędu. :)

Pratiksha
źródło
-2

sprawdź, czy na tym samym porcie działa jakikolwiek proces, wpisując polecenie:

sudo ps -ef

Możesz znaleźć proces działający na odpowiednim porcie węzła, a następnie zabić węzeł przez

kill -9 <node id>

Jeśli problem nadal występuje, po prostu zabij wszystkie węzły

killall node
Mahaveer
źródło
-3

Zabija wszystkie uruchomione porty (Mac):

killall node
Ryan Dhungel
źródło