ExpressJS - throw er Nieobsługiwane zdarzenie błędu


180

Utworzyłem aplikację expressjs przy użyciu następujących poleceń:

express -e folderName
npm install ejs --save
npm install

Po uruchomieniu aplikacji z: node app.jswystępują następujące błędy:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: listen EADDRINUSE
    at errnoException (net.js:884:11)
    at Server._listen2 (net.js:1022:14)
    at listen (net.js:1044:10)
    at Server.listen (net.js:1110:5)
    at Object.<anonymous> (folderName/app.js:33:24)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Jak to naprawić?


30
EADDRINUSE oznacza, że ​​port jest już w użyciu. spróbuj zmienić port, na którym nasłuchuje serwer WWW w app.js, lub zabij wszystko, co aktualnie używa tego portu, jeśli go nie potrzebujesz.
go-oleg

Jeśli zamykający port się nie naprawia, spróbuj tego> stackoverflow.com/a/52441297/6665568
Natesh bhat

Odpowiedzi:


400

Uruchomiłeś inny serwer korzystający z tego samego portu jak 8080.

Może masz już uruchomioną node appinną powłokę. Zamknij ją i uruchom ponownie.

Możesz sprawdzić PORT nr. jest dostępny lub nie używa

netstat -tulnp | grep <port no>

Alternatywnie możesz użyć lsof :

lsof -i :<port no>

4
Wpadłem na to za pomocą WebStorm. Miałem dwie sesje debugowania otwarte w tym samym obszarze roboczym. Doh!
Nick Curran

53
Taki typowy błąd naprawdę zasługuje na lepszy komunikat o błędzie.
Tamlyn,

Zdarzyło mi się to podczas korzystania z katalogu aktywowanego węzłem. W mojej podstawowej nazwie DNS brakowało subdomeny. baseDN: 'ldap: // dc = subdomena, dc = domena, dc = com'
Mark

Działało wystąpienie rails server...: |
Sheharyar

1
na Mac High Sierra: lsof -nP -i4TCP: $ PORT | grep LISTEN
Roee,

61

Otrzymujemy podobny błąd, gdy czasami uruchamiamy naszą aplikację ekspresową. W takim przypadku musimy postępować tak samo. Musimy sprawdzić, czy działa w dowolnym terminalu. Jeśli chcesz znaleźć i zabić proces, wykonaj następujące kroki:

  • ps aux | węzeł grep
  • Znajdź identyfikator procesu (drugi od lewej):
  • zabij -9 PRCOCESS_ID

LUB

Użyj jednego polecenia, aby zamknąć wszystkie działające procesy węzłów.

ps aux | awk '/node/{print $2}' | xargs kill -9

5
ps aux | grep node | awk '{print $2}' | xargs kill -9
Daniel

killall -r node(in linux)
jt3k

25

Instancja prawdopodobnie nadal działa. To naprawi to.

killall node

Aktualizacja: To polecenie działa tylko w systemach Linux / Ubuntu i Mac.


1
killall -9 node
Pankaj Shinde

16

Jeśli korzystasz z systemu Linux, ten problem może również wystąpić, jeśli Nodejs nie działa jako root.

Zmień z tego:

nodejs /path/to/script.js

Do tego:

sudo nodejs /path/to/script.js

Właśnie mi się przydarzyło i żadna inna sugestia tutaj tego nie naprawiła. Na szczęście przypomniałem sobie, że skrypt działał innego dnia, gdy działał jako root. Mam nadzieję, że to komuś pomoże!

Oświadczenie: To prawdopodobnie nie jest najlepsze rozwiązanie dla środowiska produkcyjnego. Uruchomienie usługi jako root może spowodować pewne luki w zabezpieczeniach twojego serwera / aplikacji. W moim przypadku było to rozwiązanie dla lokalnej usługi, ale zachęcam innych do poświęcenia trochę czasu na izolowanie przyczyny.


1
To naprawdę niebezpieczne, aby uruchomić ten skrypt jako root, aby rozwiązać ten problem. O ile nie próbujesz połączyć się z portem poniżej 1024, nigdy nie powinieneś uruchamiać węzła jako root. Podejrzewam, że w twoim przypadku próbujesz połączyć się z portem 80 lub 443. Sugeruję użycie Nginx do kierowania ruchem z tych portów do nodejs na wyższym porcie, takim jak 8000 lub coś takiego.
varikin

1
Dzięki za zwrócenie na to uwagi. Nie sądzę, że konkretny skrypt, którego użyłem, wywołał którykolwiek z tych portów, z pewnością nie używam Węzła jako serwera http. Być może był to jeden z modułów, z których korzystałem, i który wymagał dodatkowych uprawnień? Przepraszam, że minęło trochę czasu, więc nie jestem nawet pewien, który skrypt wymagał tego rozwiązania. Dodam zastrzeżenie dotyczące próby wykonania tego w środowisku produkcyjnym.
CauselessEffect

12

Jest tak, ponieważ port używany do uruchomienia skryptu jest już używany. Musisz zatrzymać wszystkie inne węzły korzystające z tego postu. w tym celu możesz sprawdzić wszystkie węzły według

ps -e

LUB tylko dla procesu węzłowego. ps -ef | grep node To da ci listę wszystkich procesów węzłowych o id

zabić cały proces węzłowy

sudo killall -9 node

Lub dla konkretnego identyfikatora sudo kill -9 id


uratowałeś moją NOCĘ!
Mujtaba Mahmood,

8

Naprawiłem błąd, zmieniając port, który był

app.set('port', process.env.PORT || 3000);<br>

i zmieniłem na:

app.set('port', process.env.PORT || 8080);<br>

1
Czym to się różni od zastosowania tego, co mówi zaakceptowana odpowiedź do odpowiedzi udzielonej przez Marka?
EWit

3

Węzeł portu, z którego próbuje skorzystać węzeł, może być już używany przez inny program. W moim przypadku był to ntop , który niedawno zainstalowałem. Musiałem otworzyć http: // localhost: 3000 / w przeglądarce, aby to zrealizować. Inny sposób znalezienia procesu znajduje się tutaj .


2

Jeśli chcesz użyć tego samego numeru portu, wpisz kill %terminal, który zabija bieżący proces w tle i uwalnia port do dalszego użycia.


2

oznacza to, że plik jest teraz uruchomiony. wystarczy wpisać poniższy kod i spróbować ponownie:

sudo pkill node

1

Zamknij wszystkie działające serwery węzłów, nawet jeśli znajdują się one w innych oknach terminali lub działają na różnych portach. To powinno rozwiązać problem.


1

Jeśli próbujesz zabić wszystkie instancje węzłów i inne usługi nasłuchujące na 3000 (domyślnie używane w konfiguracji szkieletu ekspresowego) bezskutecznie, powinieneś sprawdzić, aby upewnić się, że twoje środowisko nie definiuje „portu” jako czegoś nieoczekiwanego. W przeciwnym razie prawdopodobnie wystąpi ten sam błąd. W pliku app.js ekspresowego szkieletu zauważysz wiersz 15:

app.set('port', process.env.PORT || 3000);

1

Aby to naprawić, zakończ lub zamknij uruchomiony serwer. Jeśli używasz środowiska Eclipse IDE, wykonaj następujące czynności,

Uruchom> Debuguj

wprowadź opis zdjęcia tutaj

Kliknij uruchomiony proces prawym przyciskiem myszy i kliknij Zakończ .



1

W rzeczywistości klawisze Ctrl + C nie zwalniają portu używanego przez proces węzła. Więc jest ten błąd. Rozwiązaniem problemu było użycie następującego fragmentu kodu w server.js:

process.on('SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit(1);
});

To zadziałało dla mnie.

Możesz także sprawdzić inne rozwiązania wymienione w Graceful shutdown w NodeJS


1

Przyczyna tego błędu

Niektóre inne procesy są już uruchomione na określonym porcie

Proste i szybkie rozwiązanie

W systemie Linux na przykład jako port podano 3000

  • Otwórz terminal i uruchom lsof -i :3000. Jeśli jakikolwiek proces jest już uruchomiony na porcie 3000, zobaczysz ten wydruk na konsoli

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    16615 aegon   13u  IPv6 183768      0t0  TCP *:3000 (LISTEN)

  • Skopiuj PID (identyfikator procesu) z wyjścia

  • Uruchom sudo kill -9 16615(musisz ustawić PID po -9)

  • Uruchom serwer ponownie

0

W moim przypadku musiałem także biec vagrant reload. Nawet jeśli żaden proces węzła nie uruchomił mojej ekspresowej aplikacji na mojej maszynie wirtualnej, ciągle pojawiał się ten błąd, aż do ponownego załadowania błędnego pudełka.


0

Zatrzymaj usługę korzystającą z tego portu.

sudo service NAMEOFSERVICE stop

0

W moim przypadku problem został spowodowany przez zapomnienie wywołania next()metody expressjs `use '.

Jeśli bieżące oprogramowanie pośrednie nie zakończy cyklu żądanie-odpowiedź, musi wywołać next () w celu przekazania kontroli do następnego oprogramowania pośredniego, w przeciwnym razie żądanie pozostanie zawieszone.

http://expressjs.com/guide/using-middleware.html




0

Po kilkakrotnym zabiciu tego samego procesu i niemożności zlokalizowania tego, co jeszcze działało na porcie 8000, zdałem sobie sprawę, że próbuję uruchomić na porcie 8000 dwa razy:

Przed:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});
app.listen(port, () => {
  console.log("We are live on " + port);
});

Po:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});

0

Miałem ten sam problem i dowiedziałem się, że proces nodejs, który wcześniej anulowałem za pomocą CTRL + C, nadal działa. Problem w Windows 10 polega na tym, że Ctrl + C nie zabija z wdziękiem nodejs. Otworzyłem menedżera zadań i ręcznie zabiłem proces. Rozwiązania dostarczone w GitHub nie działały dla mnie.


0

Jeśli używasz systemu Windows, możesz zakończyć proces z menedżera zadań dla node.js


0

Żadna z odpowiedzi nie działała dla mnie.

Po ponownym uruchomieniu komputera mogłem uruchomić serwer.

Prochowiec
shutdown now -r

Linux
sudo shutdown now -r


0

-> sprawdź, co działa na porcie 8080 lub jaki port chcesz sprawdzić

lsof -i @localhost:8080

jeśli coś działa, możesz go zamknąć lub użyć komendy kill, aby go zamknąć


0

Proste, po prostu sprawdź teminal w Visual Studio Code Ponieważ ja uruchomiłem aplikację węzła i hibernowałem laptopa, a następnego ranka włączam laptopa z powrotem do tworzenia oprogramowania. Następnie uruchom ponownie komendę nodemon app.js. Najpierw uruchomiłem od nocy, a drugą uruchomiłem moje ostatnie polecenie, więc dwa monity poleceń nasłuchują na tych samych portach, dlatego otrzymujesz ten problem. Prosty Zamknij jeden terminal lub cały terminal, a następnie uruchom węzeł app.js lub nodemon app.js


0

Port, którego słuchasz, jest już nasłuchiwany przez inny proces.

Gdy napotkałem ten błąd, zabiłem proces za pomocą programu Windows PowerShell (ponieważ korzystałem z systemu Windows)

  1. List item otwórz Windows PowerShell
  2. rodzaj ps a następnie możesz uzyskać listę procesów
  3. znajdź proces o nazwie węzeł i zanotuj identyfikator
  4. typ Stop-process <Id> Myślę, że jest to pomoc dla użytkowników systemu Windows

0

Natrafiłem dzisiaj na ten sam problem i port nie był używany. Pomogło następujące podejście:

rm -rf node_modules && npm cache clean && npm install
npm start

0

JEŻELI jest w systemie Mac, chodzi o IP x86_64-apple-darwin13.4.0. Jeśli będziesz śledzić błędy, będzie to coś związanego z x86_64-apple-darwin13.4.0. Dodaj

127.0.0.1 x86_64-apple-darwin 13.4.0

do pliku / etc / hosts . Potem problem zniknął


-1

Po prostu zmień port, być może twój obecny port jest używany przez iis lub inny serwer.


Na to pytanie zadano 4 lata temu, udzielając tej samej, ale lepszej odpowiedzi.
George,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.