ExpressJS - โยนเหตุการณ์ข้อผิดพลาดที่ไม่สามารถจัดการได้


180

ฉันสร้างแอปพลิเคชัน expressjs โดยใช้คำสั่งต่อไปนี้:

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

เมื่อฉันเรียกใช้แอปพลิเคชันด้วย: node app.jsฉันมีข้อผิดพลาดดังต่อไปนี้:

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)

จะแก้ไขได้อย่างไร?


30
EADDRINUSE หมายถึงพอร์ตที่ใช้งานแล้ว ลองเปลี่ยนพอร์ตที่เว็บเซิร์ฟเวอร์ใน app.js ฟังหรือฆ่าสิ่งที่กำลังใช้พอร์ตนั้นในปัจจุบันหากคุณไม่ต้องการใช้
go-oleg

หากการปิดพอร์ตไม่ได้รับการแก้ไขให้ลองใช้วิธีนี้> stackoverflow.com/a/52441297/6665568
Natesh bhat

คำตอบ:


400

คุณเรียกใช้เซิร์ฟเวอร์อื่นใช้พอร์ตเดียวกันเช่น 8080

บางทีคุณอาจทำงานnode appในเปลือกอื่น ๆ โปรดปิดและเรียกใช้อีกครั้ง

คุณสามารถตรวจสอบหมายเลขพอร์ตได้ สามารถใช้ได้หรือไม่ได้ใช้

netstat -tulnp | grep <port no>

หรือคุณสามารถใช้lsof :

lsof -i :<port no>

4
ฉันวิ่งเข้าไปหาสิ่งนี้โดยใช้ WebStorm ฉันเปิดเซสชันการดีบักสองครั้งในพื้นที่ทำงานเดียวกัน Doh!
Nick Curran

53
ข้อผิดพลาดทั่วไปเช่นนั้นสมควรได้รับข้อความแสดงข้อผิดพลาดที่ดีกว่า
Tamlyn

สิ่งนี้เกิดขึ้นกับฉันเมื่อใช้โหนด-activedirectory baseDN ของฉันไม่มีโดเมนย่อย baseDN: 'ldap: // dc = โดเมนย่อย, dc = โดเมน, dc = com'
ทำเครื่องหมาย

กำลังใช้งานอินสแตนซ์ของrails server... : |
Sheharyar

1
บน mac high sierra: lsof -nP -i4TCP: $ PORT | grep LISTEN
Roee

61

เราได้รับข้อผิดพลาดที่คล้ายกันเมื่อบางครั้งเราเรียกใช้แอปด่วนของเรา เราต้องทำตามเหมือนกันในกรณีนั้น เราจำเป็นต้องตรวจสอบว่ามันทำงานในสถานีใด ๆ หากคุณต้องการค้นหาและฆ่ากระบวนการให้ทำตามขั้นตอนเหล่านี้:

  • ps aux | โหนด grep
  • ค้นหา ID กระบวนการ (ที่สองจากซ้าย):
  • kill -9 PRCOCESS_ID

หรือ

ใช้คำสั่งเดียวเพื่อปิดกระบวนการโหนดที่รันอยู่ทั้งหมด

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)
jt3k

25

อินสแตนซ์อาจยังทำงานอยู่ สิ่งนี้จะแก้ไข

killall node

อัปเดต: คำสั่งนี้ใช้งานได้กับ Linux / Ubuntu & Mac เท่านั้น


1
killall -9 โหนด
Pankaj Shinde

16

หากคุณอยู่บน Linux ปัญหานี้อาจเกิดขึ้นได้หาก Nodej ไม่ได้ทำงานเป็นรูท

เปลี่ยนจากสิ่งนี้:

nodejs /path/to/script.js

สำหรับสิ่งนี้:

sudo nodejs /path/to/script.js

เพิ่งเกิดขึ้นกับฉันและไม่มีคำแนะนำอื่น ๆ ที่นี่แก้ไขได้ โชคดีที่ฉันจำได้ว่าสคริปต์ทำงานเมื่อวันก่อนเมื่อทำงานเป็นรูต หวังว่านี่จะช่วยใครซักคน!

คำเตือน:นี่อาจไม่ใช่วิธีที่ดีที่สุดสำหรับสภาพแวดล้อมการผลิต การเริ่มบริการของคุณในฐานะรูทอาจแนะนำช่องโหว่ด้านความปลอดภัยให้กับเซิร์ฟเวอร์ / แอปพลิเคชันของคุณ ในกรณีของฉันนี่เป็นวิธีแก้ปัญหาสำหรับการบริการในท้องถิ่น แต่ฉันขอแนะนำให้ผู้อื่นใช้เวลาพยายามแยกสาเหตุ


1
ฟังดูอันตรายมากที่จะเรียกใช้สคริปต์เป็นหลักเพื่อแก้ปัญหานี้ ยกเว้นว่าคุณกำลังพยายามผูกเข้ากับพอร์ตที่ต่ำกว่า 1024 คุณไม่จำเป็นต้องรันโหนดในฐานะรูท ฉันสงสัยว่าในกรณีของคุณคุณกำลังพยายามผูกกับพอร์ต 80 หรือ 443 ฉันขอแนะนำให้ใช้ Nginx เพื่อรับส่งข้อมูลโดยตรงจากพอร์ตเหล่านั้นไปยัง nodejs บนพอร์ตที่สูงกว่าเช่น 8000 หรืออะไรบางอย่าง
varikin

1
ขอบคุณสำหรับการชี้ให้เห็นว่า ฉันไม่คิดว่าสคริปต์เฉพาะที่ฉันใช้เรียกใช้สำหรับพอร์ตเหล่านั้นฉันไม่ได้ใช้ Node เป็นเซิร์ฟเวอร์ http แน่นอน อาจเป็นหนึ่งในโมดูลที่ฉันใช้ซึ่งเรียกว่าการอนุญาตเพิ่มเติมหรือไม่ ฉันขอโทษมานานแล้วดังนั้นฉันจึงไม่แน่ใจด้วยซ้ำว่าสคริปต์ตัวใดที่เรียกว่าโซลูชันนี้ ฉันจะเพิ่มข้อจำกัดความรับผิดชอบเกี่ยวกับการพยายามทำสิ่งนี้ในสภาพแวดล้อมการผลิต
CauselessEffect

12

นี่เป็นเพราะพอร์ตที่คุณใช้เพื่อเรียกใช้สคริปต์มีการใช้งานแล้ว คุณต้องหยุดโหนอื่น ๆ ทั้งหมดที่ใช้โพสต์นั้น เพื่อที่คุณสามารถตรวจสอบโหนดทั้งหมดโดย

ps -e

หรือสำหรับกระบวนการโหนดใช้เท่านั้นps -ef | grep node ซึ่งจะให้รายการของกระบวนการโหนดทั้งหมดที่มี ID

เพื่อฆ่ากระบวนการโหนดทั้งหมด

sudo killall -9 node

หรือสำหรับรหัสเฉพาะ sudo kill -9 id


คุณช่วยฉันคืน!
Mujtaba Mahmood

8

ฉันแก้ไขข้อผิดพลาดโดยการเปลี่ยนพอร์ตซึ่งเป็น

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

และเปลี่ยนเป็น:

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

1
สิ่งนี้แตกต่างจากการใช้สิ่งที่คำตอบที่ยอมรับตอบว่ามาจากคำตอบของมาร์กอย่างไร
EWit

3

พอร์ตโหนที่พยายามใช้สามารถใช้งานได้โดยโปรแกรมอื่นแล้ว ในกรณีของฉันมันเป็นntopซึ่งฉันเพิ่งติดตั้ง ฉันต้องเปิดhttp: // localhost: 3000 /ในเบราว์เซอร์เพื่อรับรู้ วิธีการหากระบวนการก็จะได้รับที่นี่


2

หากคุณต้องการใช้หมายเลขพอร์ตเดียวกันจากนั้นพิมพ์kill %ในเทอร์มินัลซึ่งฆ่ากระบวนการพื้นหลังปัจจุบันและเพิ่มพอร์ตสำหรับการใช้งานเพิ่มเติม


2

นี่หมายความว่าไฟล์ของคุณกำลังทำงาน เพียงป้อนรหัสด้านล่างและลองอีกครั้ง:

sudo pkill node

1

ปิดเซิร์ฟเวอร์โหนอื่น ๆ ที่กำลังทำงานแม้ว่าจะอยู่ในเทอร์มินัล windows อื่น ๆ หรือทำงานบนพอร์ตต่าง ๆ ที่ควรแก้ไขปัญหา


1

หากคุณพยายามฆ่าทุก ๆ อินสแตนซ์ของโหนดและบริการอื่น ๆ ที่ฟังใน 3000 (ค่าเริ่มต้นที่ใช้โดยการตั้งค่าโครงกระดูกแบบด่วน) ไม่เป็นประโยชน์คุณควรตรวจสอบเพื่อให้แน่ใจว่าสภาพแวดล้อมของคุณไม่ได้กำหนด 'พอร์ต' มิฉะนั้นคุณอาจได้รับข้อผิดพลาดเดียวกัน ในไฟล์ app.js ของ Skeleton Skeleton คุณจะสังเกตเห็นบรรทัดที่ 15:

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

1

เพื่อแก้ไขปัญหานี้ให้ยุติหรือปิดเซิร์ฟเวอร์ที่คุณกำลังเรียกใช้ หากคุณกำลังใช้ Eclipse IDE ให้ทำตามนี้

รัน> ดีบัก

ป้อนคำอธิบายรูปภาพที่นี่

คลิกขวาที่กระบวนการทำงานและคลิกที่ยุติ


1

events.js: 183 การโยน; // เหตุการณ์ 'ข้อผิดพลาด' ที่ไม่สามารถจัดการได้

ฉันมีปัญหาแบบเดียวกันและลองหลายวิธี แต่ในที่สุดก็ได้สิ่งนี้ใช้ได้ดี:

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

อ้างถึงลิงค์นี้สำหรับการชี้แจงเพิ่มเติมhttps://github.com/ionic-team/ionic-cli/issues/2922


1

จริง ๆ แล้ว Ctrl + C คีย์ไม่ปล่อยพอร์ตที่ใช้โดยกระบวนการโหนด ดังนั้นจึงมีข้อผิดพลาดนี้ การแก้ไขปัญหานี้ใช้ข้อมูลโค้ดต่อไปนี้ใน server.js:

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

สิ่งนี้ใช้ได้สำหรับฉัน

นอกจากนี้คุณยังสามารถตรวจสอบวิธีแก้ไขปัญหาอื่น ๆ ที่กล่าวถึงในการปิดระบบของ Graceful ใน NodeJS


1

เหตุผลข้อผิดพลาดนี้

กระบวนการอื่นกำลังทำงานอยู่บนพอร์ตที่คุณระบุไว้แล้ว

วิธีที่ง่ายและรวดเร็ว

บน Linux OS ตัวอย่างเช่นคุณระบุ 3000 เป็นพอร์ต

  • lsof -i :3000เปิดสถานีและเรียกใช้ หากกระบวนการใดทำงานบนพอร์ต 3000 อยู่แล้วคุณจะเห็นการพิมพ์นี้บนคอนโซล

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

  • คัดลอก PID (ID กระบวนการ) จากเอาต์พุต

  • เรียกใช้sudo kill -9 16615(คุณต้องใส่ PID หลังจาก -9)

  • เริ่มต้นเซิร์ฟเวอร์อีกครั้ง

0

ในกรณีของฉันฉันต้องทำงานvagrant reloadด้วย แม้ว่าจะไม่มีกระบวนการโหนดที่เรียกใช้แอปด่วนของฉันในเครื่องเสมือนของฉันฉันยังคงได้รับข้อผิดพลาดนี้จนกว่าจะโหลดกล่องคนจรจัดอีกครั้ง



0

ในกรณีของฉันปัญหาเกิดจากการลืมโทรnext()ใน expressjs `use 'method call

หากมิดเดิลแวร์ปัจจุบันไม่สิ้นสุดรอบการตอบกลับคำขอจะต้องเรียกถัดไป () เพื่อผ่านการควบคุมไปยังมิดเดิลแวร์ถัดไปมิฉะนั้นการร้องขอจะถูกปล่อยให้หยุดทำงาน

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




0

หลังจากที่ฆ่ากระบวนการเดียวกันหลายครั้งและไม่สามารถค้นหาสิ่งอื่นที่กำลังทำงานอยู่บนพอร์ต 8000 ฉันรู้ว่าฉันกำลังพยายามทำงานบนพอร์ต 8000 สองครั้ง:

ก่อน:

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

หลังจาก:

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

ฉันพบปัญหาเดียวกันและพบว่ากระบวนการของ nodejs ที่ฉันยกเลิกไปก่อนหน้านี้ด้วย CTRL + C ยังคงทำงานอยู่ ปัญหาใน Windows 10 คือCtrl + C นั้นไม่สามารถกำจัด nodejs ได้อย่างสง่างาม ฉันเปิดตัวจัดการงานและฆ่ากระบวนการด้วยตนเอง การแก้ปัญหาที่ให้ไว้ใน GitHub ไม่ได้ผลสำหรับฉัน


0

หากคุณใช้ windows คุณสามารถจบกระบวนการจากตัวจัดการงานสำหรับ node.js


0

ไม่มีคำตอบใดที่เหมาะกับฉัน

เมื่อฉันรีสตาร์ทคอมพิวเตอร์ฉันสามารถทำให้เซิร์ฟเวอร์ทำงานได้

Mac
shutdown now -r

ลินุกซ์
sudo shutdown now -r


0

-> ตรวจสอบสิ่งที่ทำงานบนพอร์ต 8080 หรือพอร์ตใดที่คุณต้องการตรวจสอบ

lsof -i @localhost:8080

หากมีบางสิ่งที่กำลังทำงานอยู่คุณสามารถปิดหรือใช้คำสั่ง kill เพื่อปิด


0

ง่าย ๆ เพียงแค่ตรวจสอบ teminal ของคุณใน Visual Studio Code เพราะฉันใช้งานแอพโหนดของฉันและฉันจำศีลแล็ปท็อปของฉันแล้วเช้าวันรุ่งขึ้นฉันเปิดแล็ปท็อปของฉันกลับไปที่การพัฒนาซอฟต์แวร์ จากนั้นฉันเรียกใช้คำสั่งอีกครั้ง nodemon app.js ครั้งแรกที่ทำงานจากตอนกลางคืนและครั้งที่สองกำลังเรียกใช้คำสั่งล่าสุดของฉันดังนั้นคำสั่งสองคำสั่งกำลังฟังพอร์ตเดียวกันนั่นคือสาเหตุที่คุณได้รับปัญหานี้ Simple ปิดหนึ่ง termianl หรือเทอร์มินัลทั้งหมดจากนั้นรัน node app.js หรือ nodemon app.js ของคุณ


0

พอร์ตที่คุณกำลังฟังกำลังรับฟังกระบวนการอื่นอยู่แล้ว

เมื่อฉันเผชิญกับข้อผิดพลาดนี้ฉันฆ่ากระบวนการโดยใช้ Windows PowerShell (เพราะฉันใช้ Windows)

  1. รายการที่เปิด Windows PowerShell
  2. พิมพ์psแล้วคุณจะได้รับรายชื่อของกระบวนการ
  3. ค้นหากระบวนการชื่อโหนดและจดบันทึกId
  4. พิมพ์Stop-process <Id> ฉันคิดว่ามันเป็นความช่วยเหลือสำหรับผู้ใช้ windows

0

ฉันพบปัญหาเดียวกันในวันนี้และไม่ได้ใช้พอร์ต วิธีการต่อไปนี้ช่วย:

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

0

หากอยู่ใน mac แล้วมันคือทั้งหมดที่เกี่ยวกับ IP ของ x86_64-apple-darwin13.4.0 หากคุณทำตามข้อผิดพลาดมันจะเป็นสิ่งที่เกี่ยวข้องกับ x86_64-apple-darwin13.4.0 เพิ่ม

127.0.0.1 x86_64-apple-darwin13.4.0

ที่จะ/ etc / hostsไฟล์ จากนั้นปัญหาก็จะหมดไป


-1

เพียงแค่เปลี่ยนพอร์ตของคุณอาจเป็นเพราะพอร์ตปัจจุบันของคุณถูกใช้โดย iis หรือเซิร์ฟเวอร์อื่น ๆ


สิ่งนี้ถูกถามและตอบเมื่อ 4 ปีก่อนด้วยคำตอบเดียวกัน แต่ดีกว่า
George
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.