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ć?

JR Galia
źródło
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>
Glowin
źródło
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
moniczny
źródło
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.

TawabG
źródło
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.

CauselessEffect
źródło
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

Abhinav bhardwaj
źródło
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>
marcdahan
źródło
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 .

Fabien
źródło
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.

Suneha Javid
źródło
2

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

sudo pkill node
Abolfazl Miadian
źródło
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.

Jake McGuire
źródło
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);
znak
źródło
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 .

Prashanth Sams
źródło
1

events.js: 183 throw er; // Nieobsługiwane zdarzenie „błąd”

Mam również ten sam problem i próbowałem na wiele sposobów, ale w końcu to dostałem, to działa dobrze:

npm install ws@3.3.2 --save-dev --save-exact

Więcej informacji można znaleźć pod tym linkiem https://github.com/ionic-team/ionic-cli/issues/2922

Janith Udara
źródło
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

Pankaj Shinde
źródło
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
Hadi Mir
źródło
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.

cbaigorri
źródło
0

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

sudo service NAMEOFSERVICE stop
Stóg
źródło
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

Andrew Dwyer
źródło
0

Możesz także zmienić port z Gruntfile.js i uruchomić ponownie.

Narendra Solanki
źródło
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, {});
Andrew Southard
źródło
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.

Gregor Weichbrodt
źródło
0

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

CodeRider
źródło
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

tiagomenegaz
źródło
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ąć

rabiaasif
źródło
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

zaib
źródło
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
Anush
źródło
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
seb_dom
źródło
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ął

Shravan
źródło
-1

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

Akash
źródło
Na to pytanie zadano 4 lata temu, udzielając tej samej, ale lepszej odpowiedzi.
George,