Bagaimana cara memperbaiki Kesalahan: dengarkan EADDRINUSE saat menggunakan nodejs?


466

Jika saya menjalankan server dengan port 80, dan saya mencoba menggunakan xmlHTTPrequest saya mendapatkan kesalahan ini:Error: listen EADDRINUSE

Mengapa masalah bagi nodejs, jika saya ingin melakukan permintaan, sementara saya menjalankan server pada port 80? Untuk webbrowsers itu bukan masalah: Saya bisa berselancar di internet, sementara server sedang berjalan.

Servernya adalah:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

Dan permintaannya:

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

Apakah Anda yakin options.port didefinisikan sebagai 80? Apakah kode XHR berjalan di browser? Bisakah Anda menjalankan "nc -l 0.0.0.0 80" saat server ini tidak berjalan?
Timothy Meade


Anda berada di sistem mana? Beberapa sistem memerlukan sudo jika Anda ingin mendengarkan port di bawah treshold tertentu.
Kebman

masalah ini muncul karena Anda menjalankan server Anda pada port itu dan Anda belum menutup port itu, kesalahannya dengan jelas mengatakan bahwa port sudah digunakan ini terjadi pada saya adalah ketika saya membuka proyek baru dalam kode vs tanpa menutup proyek lain (membuka dengan drag and drop)
Ashad Nasim

Jawaban:


412

EADDRINUSEberarti nomor port yang listen()mencoba mengikat server sudah digunakan.

Jadi, dalam kasus Anda, harus sudah menjalankan server pada port 80.

Jika Anda memiliki server web lain yang berjalan di port ini, Anda harus meletakkan node.js di belakang server itu dan mem-proxy-nya.

Anda harus memeriksa listeningacara seperti ini, untuk melihat apakah server benar-benar mendengarkan:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);

1
Saya hanya menjalankan server ini. Sebelum saya memulai server, xmlhttprequest berfungsi. Setelah saya memulai server pada port 80, maka server juga berfungsi dengan baik. Tetapi jika saya melakukan xmlhttprequest setelah saya memulai server, maka saya mendapatkan kesalahan ini.
Danny Fox

6
Tidakkah ini masih menimbulkan kesalahan jika server sudah mendengarkan?
trysis

1
Bagi saya ini disebabkan oleh Skype
Beep

559

Yang benar-benar membantu saya adalah:

killall -9 node

Tetapi ini akan mematikan proses sistem.

Dengan

ps ax

Anda dapat memeriksa apakah itu berhasil.


1
Juga untuk saya. Dalam kasus saya, saya hanya menjalankan fungsi mendengarkan dua kali dan mendapatkan kesalahan di kedua
vabada

2
Pada catatan terkait Anda juga dapat membaca kapan saya seharusnya tidak melakukan proses .
Nobita

12
Masalahnya di sini adalah kalian tidak keluar dari proses simpul dengan anggun setelah menjalankan pertama. Oleh karena itu, simpul masih terikat ke port itu. ps aux | grep nodeakan menunjukkan itu. Alih-alih membunuh aplikasi dengan CTRL + Z , keluar dari aplikasi dengan CTRL + C . Ini keluar dari aplikasi dengan anggun dan pengikatan port dihapus.
riser101

22
Lebih dari 150 suara untuk solusi yang setara dengan memukul perangkat lunak Anda dengan palu.
LeeGee

1
Solusi ini cukup bermasalah karena flag -9 akan mematikan proses tanpa melepaskan memori. Anda harus benar-benar menggunakan ini hanya sebagai solusi terakhir.
Yaki Klein

279

Yang disebutkan di atas killall -9 node, disarankan oleh Patrick berfungsi seperti yang diharapkan dan menyelesaikan masalah tetapi Anda mungkin ingin membaca bagian edit dari jawaban ini tentang mengapa kill -9mungkin bukan cara terbaik untuk melakukannya.

Selain itu, Anda mungkin ingin menargetkan satu proses daripada membunuh semua proses aktif secara membabi buta .

Dalam hal itu, pertama-tama dapatkan ID proses (PID) dari proses yang berjalan pada port itu (katakanlah 8888):

lsof -i tcp:8888

Ini akan mengembalikan sesuatu seperti:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

Maka lakukan saja (ps - sebenarnya tidak . Silakan baca terus di bawah):

kill -9 57385

Anda dapat membaca lebih banyak tentang ini di sini .

EDIT: Saya sedang membaca tentang topik yang cukup terkait hari ini dan menemukan utas menarik ini tentang mengapa saya tidak harus melakukan kill -9suatu proses .

Secara umum, Anda harus menggunakan kill -15 sebelum kill -9 untuk memberikan proses target kesempatan untuk membersihkan setelahnya. (Proses tidak dapat menangkap atau mengabaikan SIGKILL, tetapi mereka dapat dan sering menangkap SIGTERM.) Jika Anda tidak memberikan proses kesempatan untuk menyelesaikan apa yang dilakukan dan dibersihkan, mungkin meninggalkan file yang rusak (atau keadaan lain) di sekitar bahwa itu tidak akan dapat mengerti setelah dimulai kembali.

Jadi, seperti yang dinyatakan Anda sebaiknya mematikan proses di atas dengan:

kill -15 57385

EDIT 2 : Seperti disebutkan dalam komentar di sini beberapa kali kesalahan ini merupakan konsekuensi dari tidak keluarnya proses dengan anggun. Itu berarti, banyak orang keluar perintah simpul (atau lainnya) menggunakan CTRL + Z . Cara yang benar untuk menghentikan proses yang sedang berjalan adalah mengeluarkan perintah CTRL + C yang melakukan jalan keluar yang bersih.

Keluar dari proses dengan cara yang benar akan membebaskan port itu saat dimatikan. Ini akan memungkinkan Anda untuk memulai kembali proses tanpa melalui kesulitan membunuhnya sendiri sebelum dapat menjalankannya kembali.


Di mana saya harus menjalankan perintah ini? Pada command prompt? Di konsol NPM?
Ulysses Alves

@UlyssesAlves hanya membuka jendela terminal dan mematikan proses dari sana.
Nobita

@Nobita Apakah ini berfungsi di Windows? Sekarang saya menyadari itu mungkin perintah MAC OS. Bagaimanapun, saya me-restart PC saya dan tidak mendapatkan kesalahan ini lagi. Saya pikir beberapa aplikasi lain menggunakan node port yang sama sedang mencoba untuk digunakan.
Ulysses Alves

2
pgrep node menunjukkan jika ada proses simpul yang berjalan pada Anda. pkill nodeakan membunuh mereka.
Josh.F

3
bukan untuk windows, kawan - Anda harus mencoba port lain atau menyalakan ulang komputer: P
Tom Stickel

62

Hanya sebentar saja, Skype kadang-kadang akan mendengarkan pada port 80 dan karena itu menyebabkan kesalahan ini jika Anda mencoba mendengarkan pada port 80 dari Node.js atau aplikasi lain.

Anda dapat menonaktifkan perilaku itu di Skype dengan mengakses opsi dan mengklik Tingkat Lanjut -> Koneksi -> Gunakan port 80 (Hapus centang ini)

Matikan penggunaan port Skype 80

PS Setelah melakukan perubahan itu, jangan lupa untuk me-restart Skype!


14
PS Setelah melakukan perubahan itu, jangan lupa untuk me-restart Skype!
Rob Evans

16
Ini adalah salah satu kelemahan desain yang paling mengejutkan yang pernah saya lihat. Bagaimana gila adalah Skype devs bahwa mereka akan pernah mempertimbangkan untuk mengambil lebih dari 80 atau 443?
AJB

5
Besar +1 untuk keterampilan debug Anda, Rob.
AJB

@AJB Mereka melakukannya untuk mencoba dan menembus firewall yang membatasi lalu lintas keluar untuk permintaan http, tetapi di mana firewall tidak menggunakan DPI, jadi cukup lakukan pemblokiran port dasar. Tetap saja ... ini agak konyol untuk mengaktifkan ini secara default!
Rob Evans

Ya, itu terpikir oleh saya setelah sedikit berpikir mengapa mereka melakukan ini. Tetap saja, lumpur yang benar-benar jelek. Dan gagasan bahwa itu diaktifkan secara default hanya arogan.
AJB

39

Anda harus mencoba menghentikan proses yang mendengarkan pada port 80.

Killall akan membunuh semua aplikasi node yang berjalan. Anda mungkin tidak ingin melakukan itu. Dengan perintah ini Anda hanya dapat membunuh satu aplikasi yang mendengarkan pada port yang dikenal.

Jika menggunakan unix coba perintah ini:

sudo fuser -k 80/tcp    

1
Yaki terima kasih. node killall gagal untuk saya tetapi ini berhasil.
Pat M

Terima kasih! Killall dan lsof - saya tidak bekerja untuk saya, tetapi ini berhasil.
karfus

1
Anda mungkin tidak ingin mematikan semua aplikasi simpul yang berjalan.
Yaki Klein

28

Alasan kesalahan: Anda mencoba menggunakan yang sibukport number

Dua kemungkinan solusi untuk Windows / Mac

  1. Gratis nomor port yang digunakan saat ini
  2. Pilih nomor port lain untuk program Anda saat ini


1. Nomor Port Gratis

Windows

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

masukkan deskripsi gambar di sini

Mac

Anda dapat mencoba netstat

netstat -vanp tcp | grep 3000

Untuk OSX El Capitan dan yang lebih baru (atau jika netstat Anda tidak mendukung -p), gunakan lsof

sudo lsof -i tcp:3000

jika ini tidak menyelesaikan masalah Anda, Macpengguna dapat merujuk ke diskusi lengkap tentang masalah ini Temukan (dan bunuh) proses mengunci port 3000 di Mac


2. Ubah Nomor Port?

Windows

set PORT=5000

Mac

export PORT=5000

Anda dapat melakukannya dalam satu perintah di windows juga:netstat -ona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /f
Z. Khullah

27

Di bawah kontroler env, Anda dapat menggunakan:

pkill node sebelum menjalankan skrip Anda harus melakukan pekerjaan.

Ingat perintah ini akan membunuh semua node proses, yang mungkin benar jika Anda memiliki sebuah wadah yang hanya menjalankan satu instance, kami memiliki env di mana Anda dapat menjamin hal itu.

Dalam skenario lain, saya sarankan menggunakan perintah untuk membunuh id proses tertentu atau nama yang Anda temukan dengan mencarinya secara terprogram. seperti jika proses Anda dipanggil, simpul-server-1 bisa Anda lakukan pkill node-server-1.

Sumber ini mungkin berguna untuk memahami: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/


2
pgrep nodesebelum tangan jika Anda ingin sedikit berhati-hati dan melihat nodeproses apa yang sedang berjalan
Josh.F

1
Benar-benar !, saya berbicara kalau-kalau itu adalah wadah atau tempat yang sangat terkendali untuk proses tersebut.
Javier Cobos

Ini adalah jawaban yang luar biasa yang akan saya katakan daripada yang lain di atas. Semua orang tolong beri suara.
Jitendra Pawar

@JavierCobos: jika Anda berbicara dalam wadah atau ruang terkontrol serupa, tambahkan informasi itu ke jawabannya sendiri. Banyak orang tidak dalam lingkungan seperti itu, terutama pada mesin pengembangan, dan ini bisa memiliki konsekuensi yang tidak diinginkan seperti apa adanya. Menunduk, tetapi senang mengubah suara dengan klarifikasi yang tepat.
lindes

1
Banyak yang akan ... tetapi sebagai seseorang yang menghabiskan banyak waktu membantu melatih pengembang junior, dan bahkan di luar konteks itu, saya dapat memberitahu Anda bahwa banyak orang memanfaatkan jawaban Stack Overflow tanpa benar-benar memahami apa yang mereka lakukan. .. Mereka hanya dihadapkan dengan masalah, dan melihat sesuatu diwakili sebagai solusi untuk apa yang tampaknya menjadi masalah mereka, dan mereka menjalankannya. Jadi ... Saya pribadi menginginkan situs untuk memberikan penjelasan yang baik dan menumbuhkan kebiasaan umum yang baik. Jadi, dari situlah saya berasal. Saya tahu itu bukan satu-satunya perspektif. :)
lindes

16

Aplikasi Anda sudah berjalan di port 8080 itu. Gunakan kode ini untuk mematikan port dan menjalankan kode Anda lagi

sudo lsof -t -i tcp:8080 | xargs kill -9

Pertanyaan tersebut merujuk pada port 80, bukan 8080. Selain itu, mungkin ini akan berhasil untuk menghilangkan proses yang menyinggung pada port 8080, menggunakan kill -9hampir pasti berlebihan, dan, menurut pendapat saya, nasihat yang mengerikan untuk diberikan tanpa peringatan khusus tentang Itu. killMungkin hanya akan melakukan trik, dan sungguh, masalah mendasar dalam pertanyaan ini adalah, saya pikir, bahwa mereka mencoba untuk menjalankan kembali server berulang-ulang, jadi ini hanya peretasan, bukan perbaikan. Mereka perlu memiliki pemahaman yang lebih baik tentang apa yang terjadi, yang tidak benar-benar diberikan oleh jawaban ini.
lindes

15

Hal lain yang dapat memberikan kesalahan ini, adalah dua server HTTP dalam kode simpul yang sama. Saya memperbarui beberapa kode Express 2 ke Express 3, dan punya ...

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});        

// tons of shit.

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});                                                                   

Dan, itu memicu kesalahan ini.


14

Ini berfungsi untuk saya (saya menggunakan mac). Jalankan perintah ini

lsof -PiTCP -sTCP:LISTEN

Ini akan menampilkan daftar port yang digunakan syetem Anda. Temukan PIDnode Anda sedang berjalan

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node      17269 hientrq   16u  IPv6 0xc42959c6fa30c3b9      0t0  TCP *:51524 (LISTEN)
node      17269 hientrq   19u  IPv4 0xc42959c71ae86fc1      0t0  TCP localhost:1337 (LISTEN)

dan lari kill -9 [YOUR_PID]


11

EADDRINUSEberarti bahwa port (yang kami coba dengarkan dalam aplikasi node) sudah digunakan. Untuk mengatasinya, kita perlu mengidentifikasi proses mana yang berjalan dengan port itu.

Sebagai contoh jika kita mencoba mendengarkan aplikasi simpul kita di 3000 port. Kita perlu memeriksa apakah port itu sudah digunakan oleh proses lain.

Langkah 1:

$sudo netstat -plunt |grep :3000

Bahwa perintah di atas memberikan hasil di bawah ini.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

Langkah 2:

Sekarang Anda mendapat ID proses (25315), Bunuh proses itu.

kill -9 25315

step3:

npm run start

Catatan: Solusi ini untuk pengguna linux.


9
lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393

3
Harap tambahkan lebih banyak konteks pada jawaban Anda untuk membantu pembaca di masa mendatang memahami kode / perintah.
Milo

8

sudo kill $ (sudo lsof -t -i: 80)

untuk membunuh kekuatan

sudo kill -9 $ (sudo lsof -t -i: 80)

gunakan cmd di atas untuk mematikan port tertentu dan kemudian jalankan server Anda


8

Coba kedua perintah dan itu akan menghentikan semua proses simpul.

killall 9 node
pkill node
npm start 

1
peretasan ini membantu saya, menghemat banyak waktu, terima kasih
Anoop PS

5

Kesalahan ini terjadi ketika Anda memiliki proses yang berjalan pada port di mana Anda ingin menjalankan aplikasi Anda.

cara mendapatkan proses mana yang berjalan pada perintah port =>: sudo netstat -ap | grep: 3000

output: Anda akan mendapatkan informasi proses yang menggunakan port itu

tcp 0 0 Alamat IP: 3000 : LISTEN 26869 / node

Sekarang Anda dapat membunuh proses itu sudo kill -9 26869


Memeriksa semua jawaban. Tetapi Anda memecahkan masalah saya.
Rahul


5

EADDRINUSE berarti port aplikasi nodejs Anda sudah digunakan.

  • Sekarang Anda telah mematikan proses / aplikasi yang berjalan di port itu.
  • Temukan id proses aplikasi dengan:

lsof -i tcp: 3000

  • Sekarang Anda akan mendapatkan id proses dari ini.
  • Jalankan ini:

kill -9 processId


4

Ada cara untuk menghentikan proses menggunakan Task Manager:

Perhatikan bahwa solusi ini hanya untuk Windows

  1. Buka Pengelola Tugas (atau menggunakan pintasan Ctrl+ Shift+ Esc)

  2. Pada "Proses Latar Belakang", cari proses "Node.js" dan hentikan prosesnya (Klik kanan dan pilih "Akhiri Tugas")

masukkan deskripsi gambar di sini

  1. Sekarang Anda harus dapat memulai lagi

Untuk pengguna mac: 1. Luncurkan 'Monitor Aktivitas' 2. Cari 'simpul' di bilah pencarian di kanan atas. 3. Klik dua kali pada proses simpul dan berhenti. Anda sudah siap !!!! Selamat coding.
Apogee

3

Saya telah melihat kesalahan ini sebelumnya (dalam node) dengan http.client, dan seingat saya, masalahnya ada pada tidak menginisialisasi httpClient atau pengaturan opsi buruk dalam pembuatan httpClient dan / atau dalam permintaan url.


3

Saya memiliki masalah yang sama juga, dan saya cukup menutup terminal dan membuka terminal baru dan jalankan

node server.js

lagi. itu bekerja untuk saya, beberapa waktu hanya perlu menunggu beberapa detik sampai bekerja lagi.

Tetapi ini hanya berfungsi pada mesin pengembang dan bukan pada konsol server ..


3

Kesalahan: mendengarkan EADDRINUSE berarti port yang ingin Anda tetapkan / ikat ke server aplikasi Anda sudah digunakan. Anda dapat menetapkan port lain untuk aplikasi Anda.

Atau jika Anda ingin menetapkan port yang sama ke aplikasi. Kemudian bunuh aplikasi yang berjalan di port yang Anda inginkan.

Untuk aplikasi simpul yang dapat Anda coba adalah, cari id proses untuk aplikasi simpul dengan:

ps -aux | grep node

Setelah mendapatkan id proses, lakukan

kill process_id

-Di Windows 10?
Tom Stickel

Tidak -aux untuk sistem berbasis linux. Untuk sistem berbasis windows Anda dapat mencari sistem montior untuk proses simpul yang diinginkan dan mengakhirinya.
Parth Vyas

2

Pada Debian saya menemukan untuk dijalankan pada port 80 Anda perlu mengeluarkan perintah sebagai root yaitu

sudo node app.js

Saya harap ini membantu


2

Dalam kasus saya Apache HTTP Server dijalankan pada port 80 saya menyelesaikannya dengan mengeluarkan perintah sebagai root

sudo killall httpd

Memperbarui

Jika Jenkin diinstal dan dijalankan pada Mac Anda;

  1. Anda dapat memeriksanya sudo lsof -i tcp:8080
  2. Jika Ya, dan Anda ingin menghentikan Jenkins hanya sekali, jalankan: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

2

Tampaknya ada proses melayani Node ng lain berjalan. Periksa dengan mengetik ini di konsol Anda (Linux / Mac):

ps aux|grep node

dan berhenti dengan:

kill -9 <NodeProcessId>

ATAU penggunaan alternativley

ng serve --port <AnotherFreePortNumber>

untuk melayani proyek Anda di pelabuhan gratis pilihan Anda.


1

Saat membunuh NODE_PORT, itu mungkin membunuh proses chrome Anda atau apa pun yang mendengarkan port yang sama, dan itu menjengkelkan.

Skrip shell ini mungkin membantu - dalam kasus saya portnya adalah 1337 tetapi Anda dapat mengubahnya kapan saja

# LOGIC

CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`

for pid in $PORT_PIDS
do

if [[ ${CHROME_PIDS} != *$pid* ]];then

    # NOT FOUND IN CHROME PIDS

    echo "Killing $pid..."
    ps -p "$pid"

    kill -kill "$pid"
    fi

done

sails lift
# OR 'node app' OR whatever that starts your node

exit

1

Dalam kasus saya, saya menggunakan hosting web tetapi sama dengan host lokal, saya menggunakan:

ps -aef | grep 'node' 

untuk menonton proses simpul itu, konsol menunjukkan proses dengan PID. untuk mematikan proses Anda harus menggunakan perintah ini:

kill -9 PID

di mana PID adalah id proses dari perintah di atas.


1

Dua server tidak dapat mendengarkan pada port yang sama, jadi periksa apakah server lain mendengarkan pada port yang sama, juga periksa untuk sinkronisasi browser jika berjalan pada port yang sama


1

Untuk orang lain di windows 10 dengan simpul sebagai localhostdan berjalan pada port seperti 3.500, bukan 80 ...

Apa yang tidak berhasil:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

Apa yang menunjukkan informasi tetapi tetap tidak berfungsi:

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

Apa yang berhasil:

Git Bash atau Powershell di Windows

  net -a -o | grep 3500   (whatever port you are looking for) 

Perhatikan PID (paling kanan)
saya tidak bisa mulai killallbekerja ... begitu

  1. Buka pengelola tugas Anda
  2. Pada tab proses, klik kanan pada Nama atau kolom apa saja dan pilih untuk memasukkan PID
  3. Urutkan berdasarkan PID, lalu klik kanan pada PID kanan dan klik akhiri tugas.

Sekarang setelah latihan yang tidak begitu menyenangkan di windows, saya menyadari bahwa saya dapat menggunakan task manager dan menemukan mesin Node dan hanya mengakhirinya.

FYI, saya menggunakan Visual Studio Code untuk menjalankan Node pada port 3500, dan saya menggunakan shell Git Bash di dalam kode VS. Saya telah keluar dengan anggun dengan Ctrl + C, tetapi kadang-kadang ini tidak membunuhnya. Saya tidak ingin mengubah port saya atau reboot jadi ini berfungsi. Semoga ini bisa membantu orang lain. Kalau tidak, itu adalah dokumentasi untuk saya sendiri.


1

Untuk pengguna windows, jalankan perintah berikut di jendela PowerShell untuk mematikan semua proses simpul.

Stop-Process -processname node

1

Opsi yang berfungsi untuk saya:

Lari:

ps -ax | grep node

Anda akan mendapatkan sesuatu seperti:

 8078 pts/7    Tl     0:01 node server.js
 8489 pts/10   S+     0:00 grep --color=auto node    
 kill -9 8078
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.