ExpressJS - throw er İşlenmeyen hata olayı


180

Aşağıdaki komutları kullanarak expressjs uygulaması oluşturdum:

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

Uygulamayı ile çalıştırdığımda:, node app.jsaşağıdaki hatalar var:

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)

Nasıl düzeltebilirim?


30
EADDRINUSE, bağlantı noktasının zaten kullanımda olduğu anlamına gelir. app.js'deki web sunucusunun hangi bağlantı noktasını dinlediğini değiştirmeyi deneyin veya ihtiyacınız yoksa o bağlantı noktasını kullanan her şeyi öldürün.
go-oleg

Kapatma bağlantı noktası sabitlenmiyorsa, şunu deneyin> stackoverflow.com/a/52441297/6665568
Natesh bhat

Yanıtlar:


400

8080 gibi aynı bağlantı noktasını kullanan başka bir sunucu çalıştırdınız.

Belki node appbaşka bir kabukta koştunuz, lütfen kapatın ve tekrar çalıştırın.

PORT no. kullanılabilir veya kullanılmıyor

netstat -tulnp | grep <port no>

Alternatif olarak, lsof kullanabilirsiniz :

lsof -i :<port no>

4
WebStorm kullanarak bunu koştum. Aynı çalışma alanında iki hata ayıklama oturumu açtım. Doh!
Nick Curran

53
Böyle yaygın bir hata gerçekten daha iyi bir hata mesajını hak eder.
Tamlyn

Düğüm-etkin dizin kullanılırken bu bana oldu. BaseDN'mde alt alan adı eksikti. baseDN: 'ldap: // dc = alt alan adı, dc = alan adı, dc = com'
Mark

Bir örneği çalıştırıyordu rails server...: |
Sheharyar

1
mac yüksek sierra üzerinde: lsof -nP -i4TCP: $ PORT | grep LISTEN
Roee

61

Bazen ekspres uygulamamızı çalıştırdığımızda benzer bir hata alırız. Bu durumda da aynısını takip etmeliyiz. Herhangi bir terminalde çalışıp çalışmadığını kontrol etmeliyiz. İşlemi bulmak ve öldürmek istiyorsanız, şu adımları izleyin:

  • ps aux | grep düğümü
  • İşlem kimliğini bulun (soldan ikinci):
  • öldür -9 PRCOCESS_ID

VEYA

Çalışan tüm düğüm işlemlerini kapatmak için tek bir komut kullanın.

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

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

killall -r node(Linux'ta)
jt3k

25

Bir örnek muhtemelen hala çalışıyor. Bu sorunu düzeltir.

killall node

Güncelleme: Bu komut yalnızca Linux / Ubuntu ve Mac üzerinde çalışacaktır.


1
killall -9 düğümü
Pankaj Shinde

16

Linux'taysanız, Nodejs kök olarak çalışmıyorsa da bu sorun oluşabilir.

Bundan değiştirin:

nodejs /path/to/script.js

Buna:

sudo nodejs /path/to/script.js

Sadece başıma geldi ve buradaki diğer önerilerin hiçbiri bunu düzeltmedi. Neyse ki geçen gün senaryo kök olarak çalışırken hatırlıyorum. Umarım bu birine yardımcı olur!

Feragatname: Bu muhtemelen bir üretim ortamı için en iyi çözüm değildir. Hizmetinizi root olarak başlatmak sunucunuza / uygulamanıza bazı güvenlik açıkları getirebilir. Benim durumumda, bu yerel bir hizmet için bir çözümdü, ancak başkalarını nedeni izole etmeye çalışmak için biraz daha fazla zaman harcamaya teşvik ediyorum.


1
Bu sorunu çözmek için komut dosyasını root olarak çalıştırmak gerçekten tehlikeli görünüyor. 1024'ten küçük bir bağlantı noktasına bağlanmaya çalışmadığınız sürece, düğümü asla kök olarak çalıştırmanız gerekmez. Sizin durumunuzda, 80 veya 443 numaralı bağlantı noktasına bağlanmaya çalıştığınızdan şüpheleniyorum. Nginx'i, bu bağlantı noktalarından 8000 gibi daha yüksek bir bağlantı noktasındaki nodejs'e trafiği yönlendirmek için kullanmanızı öneririm.
varikin

1
Bunu işaret ettiğiniz için teşekkürler. Ben kullandığım belirli komut dosyası bu bağlantı noktaları herhangi biri için sanmıyorum, kesinlikle bir http sunucusu olarak düğüm kullanmıyorum. Belki de kullandığım modüllerden biriydi ve ek izinleri çağırdı. Bir süredir özür dilerim, bu yüzden hangi betiğin bu çözüm için çağrıldığından bile emin değilim. Bunu bir üretim ortamında denemeye ilişkin bir feragatname ekleyeceğim.
CauselessEffect

12

Bunun nedeni, komut dosyasını çalıştırmak için kullandığınız bağlantı noktasının zaten kullanımda olmasıdır. Bu yayını kullanan diğer tüm düğümleri durdurmanız gerekir. bunun için tüm düğümü

ps -e

VEYA sadece düğüm işlemi için kullan ps -ef | grep node Bu, kimliğine sahip tüm düğüm işlemlerinin listesini verir.

tüm düğüm sürecini öldürmek

sudo killall -9 node

Veya belirli bir kimlik için sudo kill -9 id


GECEMİ kurtardın!
Mujtaba Mahmood

8

Bu bağlantı noktasını değiştirerek hatayı düzelttim

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

ve şu şekilde değiştirildi:

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

1
Bu, kabul edilen cevabın söylediklerini Mark tarafından verilen cevaba uygulamaktan ne şekilde farklıdır?
EWit


2

Aynı bağlantı noktası numarasını kullanmak istiyorsanız kill %, geçerli arka plan işlemini öldüren ve daha fazla kullanım için bağlantı noktasını serbest bırakan terminali yazın .


2

bu, dosyanızın şimdi çalıştığı anlamına gelir. aşağıdaki kodu girip tekrar deneyin:

sudo pkill node

1

Başka terminal pencerelerinde veya farklı bağlantı noktalarında çalışıyor olsalar da, çalışan diğer düğüm sunucularını kapatın. Bu sorunu düzeltmelidir.


1

3000'i (ekspres iskelet kurulumu tarafından kullanılan varsayılan) dinleyen tüm düğüm örneklerini ve diğer hizmetleri boşuna öldürmeyi denediyseniz, ortamınızın 'bağlantı noktasını' beklenmedik bir şey olarak tanımlamadığından emin olmalısınız. Aksi takdirde, muhtemelen aynı hatayı alırsınız. Ekspres iskeletin app.js dosyasında 15. satırı fark edeceksiniz:

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

1

Bunu düzeltmek için çalıştırdığınız sunucuyu sonlandırın veya kapatın. Eclipse IDE kullanıyorsanız bunu takip edin,

Çalıştır> Hata Ayıkla

resim açıklamasını buraya girin

Çalışan işlemi sağ tıklatın ve Sonlandır'ı tıklatın .



1

Aslında Ctrl + C tuşları düğüm işlemi tarafından kullanılan bağlantı noktasını serbest bırakmıyor. Yani bu hata var. Sorunun çözümü, server.js dosyasında aşağıdaki kod snippet'ini kullanıyordu:

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

Bu benim için çalıştı.

Ayrıca NodeJS'deki Zarif kapatmada belirtilen diğer çözümleri de kontrol edebilirsiniz.


1

Bu hatanın nedeni

Belirttiğiniz bağlantı noktasında başka bir işlem zaten çalışıyor

Basit ve Hızlı çözüm

Linux işletim sisteminde, örneğin port olarak 3000'i belirttiniz

  • Terminali açın ve çalıştırın lsof -i :3000. 3000 numaralı bağlantı noktasında zaten bir işlem çalışıyorsa, bu yazdırmayı konsolda göreceksiniz

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

  • PID'yi (işlem kimliği) çıktıdan kopyalayın

  • Çalıştır sudo kill -9 16615(-9'dan sonra PID koymalısınız)

  • Sunucuyu yeniden başlatın

0

Benim durumumda da koşmak zorunda kaldım vagrant reload. Express makinemi sanal makinemde çalıştıran hiçbir düğüm işlemi olmasa bile, vagrant kutusunu yeniden yükleyene kadar bu hatayı alıyordum.


0

Bu bağlantı noktasını kullanan hizmeti durdurun.

sudo service NAMEOFSERVICE stop

0

Benim durumumda sorun, next()bir expressjs `use 'yöntemi çağrısında çağrı yapmayı unutmaktan kaynaklandı .

Geçerli ara katman yazılımı istek yanıt döngüsünü sonlandırmazsa, denetimi bir sonraki ara katman yazılımına geçirmek için next () öğesini çağırmalıdır, aksi takdirde istek asılı kalır.

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



0

Bağlantı noktasını Gruntfile.js'den de değiştirebilir ve tekrar çalıştırabilirsiniz.


0

Aynı işlemi birden çok kez öldürdükten ve bağlantı noktası 8000'de başka neler çalıştığını bulamadıktan sonra, bağlantı noktası 8000'de iki kez çalıştırmaya çalıştığımı fark ettim:

Önce:

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);
});

Sonra:

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

Aynı sorunu yaşadım ve daha önce CTRL + C ile iptal ettiğim bir nodejs işleminin hala çalıştığını öğrendim. Windows 10'daki sorun, Ctrl + C'nin Nodejs'leri Zarifçe Öldürmemesi. Görev yöneticisini açtım ve işlemi manuel olarak öldürdüm. GitHub'da sağlanan çözümler benim için işe yaramadı.


0

Windows kullanıyorsanız, node.js için görev yöneticisinden işlemi sonlandırabilirsiniz


0

Cevapların hiçbiri işe yaramadı.

Bilgisayarımı yeniden başlattığımda sunucuyu açıp çalıştırabilirim.

Mac
shutdown now -r

Linux
sudo shutdown now -r


0

-> 8080 numaralı bağlantı noktasında nelerin çalıştığını veya kontrol etmek istediğiniz bağlantı noktasını kontrol edin

lsof -i @localhost:8080

bir şey çalışıyorsa onu kapatabilir veya kapatmak için kill komutunu kullanabilirsiniz


0

Basit sadece Visual Studio Code teminal kontrol çünkü ben benim düğüm uygulaması çalıştırıyordu ve ben dizüstü bilgisayarımı hazırda bekleme sonra ertesi sabah ben yazılım geliştirme için geri dizüstü açmak. Sonra tekrar komut nodemon app.js çalıştırın. İlk waas gece çalışan ve ikincisi en son komutumu çalıştırıyordu, bu yüzden iki komut istemi aynı bağlantı noktalarını dinliyor bu yüzden bu sorunu alıyorsunuz. Basit Bir termianl veya tüm terminali kapatın, ardından app.js veya nodemon app.js düğümünüzü çalıştırın


0

Dinlediğiniz bağlantı noktası zaten başka bir işlem tarafından dinleniyor.

Bu hatayla karşılaştığımda Windows PowerShell kullanarak işlemi öldürdüm (çünkü Windows kullandım)

  1. Windows powershell'i açın
  2. tip ps ve işlemlerin listesini alabilirsiniz
  3. düğüm adlı işlemi bul ve kimliği not et
  4. tip Stop-process <Id> Bence Windows kullanıcıları için yardım

0

Bugün de aynı sorunla karşılaştım ve liman kullanılmadı. Aşağıdaki yaklaşım yardımcı oldu:

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

0

Mac'te ise, hepsi x86_64-apple-darwin13.4.0'ın IP'si ile ilgilidir. Hataları takip ederseniz, x86_64-apple-darwin13.4.0 ile ilgili bir şey olurdu. Ekle

127.0.0.1 x86_64-elma-darwin13.4.0

için / etc / hosts dosyası. O zaman sorun gitti


-1

Portunuzu değiştirin, mevcut portunuz iis veya başka bir sunucu tarafından kullanılıyor olabilir.


Bu 4 yıl önce aynı ama daha iyi bir cevapla sorulmuş ve cevaplanmıştır.
George
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.