ExpressJS - sự kiện lỗi chưa được xử lý


180

Tôi đã tạo ứng dụng expressjs bằng các lệnh sau:

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

Khi tôi chạy ứng dụng với : node app.js, tôi gặp các lỗi sau:

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)

Làm thế nào để khắc phục nó?


30
EADDRINUSE có nghĩa là cổng đã được sử dụng. hãy thử thay đổi cổng nào mà máy chủ web trong app.js lắng nghe hoặc tắt bất cứ thứ gì hiện đang sử dụng cổng đó nếu bạn không cần nó.
go-oleg

Nếu đóng cổng không sửa, hãy thử điều này> stackoverflow.com/a/52441297/6665568
Natesh bhat

Câu trả lời:


400

Bạn đã chạy một máy chủ khác sử dụng cùng một cổng như 8080.

Có lẽ bạn đã chạy node apptrong shell khác, Hãy đóng nó và chạy lại.

Bạn có thể kiểm tra PORT no. có sẵn hay không sử dụng

netstat -tulnp | grep <port no>

Ngoài ra, bạn có thể sử dụng lsof :

lsof -i :<port no>

4
Tôi chạy vào đây bằng WebStorm. Tôi đã có hai phiên gỡ lỗi mở trong cùng một không gian làm việc. Đừng!
Nick Curran

53
Một lỗi phổ biến như vậy thực sự xứng đáng với một thông báo lỗi tốt hơn.
Tamlyn

Điều này xảy ra với tôi khi sử dụng nút kích hoạt nút. BaseDN của tôi bị thiếu tên miền phụ. baseDN: 'ldap: // dc = tên miền phụ, dc = tên miền, dc = com'
Đánh dấu

Đang chạy một ví dụ của rails server...: |
Sheharyar

1
trên mac sierra cao: lsof -nP -i4TCP: $ PORT | grep LISTEN
Roee

61

Chúng tôi nhận được lỗi tương tự khi đôi khi chúng tôi chạy ứng dụng thể hiện của chúng tôi. Chúng ta phải làm theo như vậy trong trường hợp đó. Chúng ta cần kiểm tra nếu nó chạy trong bất kỳ thiết bị đầu cuối. Nếu bạn muốn tìm và giết quá trình, hãy làm theo các bước sau:

  • ps phụ | nút grep
  • Tìm ID tiến trình (thứ hai từ bên trái):
  • giết -9 PRCOCESS_ID

HOẶC LÀ

Sử dụng một lệnh duy nhất để đóng tất cả các quy trình nút đang chạy.

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

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

killall -r node(trong linux)
jt3k

25

Một ví dụ có thể vẫn đang chạy. Điều này sẽ khắc phục nó.

killall node

Cập nhật: Lệnh này sẽ chỉ hoạt động trên Linux / Ubuntu & Mac.


1
nút killall -9
Pankaj Shinde

16

Nếu bạn đang dùng Linux, vấn đề này cũng có thể xảy ra nếu Nodejs không chạy bằng root.

Thay đổi từ đây:

nodejs /path/to/script.js

Về điều này:

sudo nodejs /path/to/script.js

Chỉ xảy ra với tôi và không có gợi ý nào khác ở đây đã sửa nó. May mắn thay tôi nhớ kịch bản đã làm việc vào ngày khác khi chạy bằng root. Hy vọng điều này sẽ giúp được ai đó!

Tuyên bố miễn trừ trách nhiệm: Đây có lẽ không phải là giải pháp tốt nhất cho môi trường sản xuất. Bắt đầu dịch vụ của bạn với quyền root có thể giới thiệu một số lỗ hổng bảo mật cho máy chủ / ứng dụng của bạn. Trong trường hợp của tôi, đây là một giải pháp cho một dịch vụ địa phương, nhưng tôi khuyến khích những người khác dành thêm thời gian để cố gắng cô lập nguyên nhân.


1
Âm thanh thực sự nguy hiểm khi chỉ chạy script như root để giải quyết vấn đề này. Trừ khi bạn đang cố gắng liên kết với một cổng dưới 1024, bạn không bao giờ cần phải chạy nút dưới dạng root. Tôi nghi ngờ trong trường hợp của bạn, bạn đang cố gắng liên kết với cổng 80 hoặc 443. Tôi sẽ đề nghị sử dụng Nginx để điều hướng lưu lượng truy cập từ các cổng đó đến nodejs trên một cổng cao hơn, như 8000 hoặc một cái gì đó.
varikin

1
Cảm ơn đã chỉ ra rằng. Tôi không nghĩ tập lệnh cụ thể mà tôi đang sử dụng được gọi cho bất kỳ cổng nào trong số đó, tôi chắc chắn không sử dụng Node làm máy chủ http. Có lẽ đó là một trong những mô-đun tôi đã sử dụng để gọi thêm quyền? Tôi xin lỗi đã lâu rồi nên tôi thậm chí không chắc kịch bản nào được gọi cho giải pháp này. Tôi sẽ thêm từ chối trách nhiệm về việc thử điều này trong môi trường sản xuất.
CauslessEffect 14/07/2015

12

Điều này là do cổng bạn đang sử dụng để chạy tập lệnh đã được sử dụng. Bạn phải dừng tất cả các nút khác đang sử dụng bài đăng đó. cho điều đó, bạn có thể kiểm tra tất cả các nút bằng cách

ps -e

HOẶC cho quá trình nút chỉ sử dụng ps -ef | grep node Điều này sẽ cung cấp cho bạn danh sách tất cả quy trình nút có id

để giết tất cả quá trình nút

sudo killall -9 node

Hoặc cho id cụ thể sudo kill -9 id


bạn đã cứu ĐÊM của tôi!
Mujtaba Mahmood

8

Tôi đã sửa lỗi bằng cách thay đổi cổng

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

và đổi thành:

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

1
Làm thế nào điều này khác với việc áp dụng những gì câu trả lời được chấp nhận nói với câu trả lời được đưa ra bởi Mark?
EWit

3

Cổng Node đang cố sử dụng có thể đã được sử dụng bởi một chương trình khác. Trong trường hợp của tôi, đó là ntop , mà tôi đã cài đặt gần đây. Tôi đã phải mở http: // localhost: 3000 / trong một trình duyệt để nhận ra điều đó. Một cách khác để tìm quá trình được đưa ra ở đây .


2

Nếu bạn muốn sử dụng cùng một số cổng thì hãy nhập kill %vào thiết bị đầu cuối, nó sẽ giết quá trình nền hiện tại và giải phóng cổng để sử dụng tiếp.


2

điều này có nghĩa là tập tin của bạn đang chạy chỉ cần nhập mã dưới đây và thử lại:

sudo pkill node

1

Đóng bất kỳ máy chủ nút nào khác đang chạy, ngay cả khi chúng ở trong các cửa sổ đầu cuối khác hoặc chạy trên các cổng khác nhau. Điều đó sẽ khắc phục vấn đề.


1

Nếu bạn đã cố gắng giết tất cả các phiên bản nút và các dịch vụ khác nghe trên 3000 (mặc định được sử dụng bởi thiết lập bộ xương tốc hành), nhưng bạn nên kiểm tra để đảm bảo rằng môi trường của bạn không xác định 'cổng' là điều gì đó bất ngờ. Nếu không, bạn có thể sẽ nhận được cùng một lỗi. Trong tệp app.js của bộ xương tốc hành, bạn sẽ nhận thấy dòng 15:

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

1

Để khắc phục điều này, chấm dứt hoặc đóng máy chủ bạn đang chạy. Nếu bạn đang sử dụng IDE Eclipse, thì hãy làm theo điều này,

Chạy> Gỡ lỗi

nhập mô tả hình ảnh ở đây

Nhấp chuột phải vào quá trình đang chạy và nhấp vào Chấm dứt .


1

event.js: 183 ném er; // Sự kiện 'lỗi' chưa được xử lý

Tôi cũng gặp vấn đề tương tự và đã thử nhiều cách nhưng cuối cùng cũng hiểu được, điều này hoạt động tốt:

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

Tham khảo liên kết này để biết thêm chi tiết https://github.com/ionic-team/ionic-cli/issues/2922


1

Trên thực tế, các phím Ctrl + C không giải phóng cổng được sử dụng bởi quá trình nút. Vì vậy, có lỗi này. Việc giải quyết vấn đề là sử dụng đoạn mã sau trong server.js:

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

Điều này làm việc cho tôi.

Bạn cũng có thể kiểm tra các giải pháp khác được đề cập khi tắt máy Graceful trong NodeJS


1

Lý do cho lỗi này

Một số quy trình khác đã chạy trên cổng mà bạn đã chỉ định

Giải pháp đơn giản và nhanh chóng

Trên hệ điều hành Linux, ví dụ bạn đã chỉ định 3000 là cổng

  • Mở terminal và chạy lsof -i :3000. Nếu bất kỳ quá trình nào đang chạy trên cổng 3000 thì bạn sẽ thấy bản in này trên bàn điều khiển

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

  • Sao chép PID (ID tiến trình) từ đầu ra

  • Chạy sudo kill -9 16615(bạn phải đặt PID sau -9)

  • Khởi động lại máy chủ

0

Trong trường hợp của tôi, tôi cũng phải chạy vagrant reload. Ngay cả khi không có quá trình nút nào chạy ứng dụng express của tôi trong máy ảo, tôi vẫn gặp lỗi này cho đến khi tải lại hộp vagrant.


0

Dừng dịch vụ đang sử dụng cổng đó.

sudo service NAMEOFSERVICE stop

0

Trong trường hợp của tôi, vấn đề xảy ra là do quên gọi next()trong một cuộc gọi phương thức 'use' expressjs.

Nếu phần mềm trung gian hiện tại không kết thúc chu kỳ phản hồi yêu cầu, nó phải gọi next () để chuyển điều khiển sang phần mềm trung gian tiếp theo, nếu không yêu cầu sẽ bị treo.

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




0

Sau khi giết quá trình tương tự nhiều lần và không thể xác định được những gì khác đang chạy trên cổng 8000, tôi nhận ra rằng tôi đang cố gắng chạy trên cổng 8000 hai lần:

Trước:

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

Sau:

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

Tôi đã có cùng một vấn đề và tôi phát hiện ra rằng quy trình nodejs mà tôi đã hủy trước đó với CTRL + C vẫn đang chạy. Vấn đề trong Windows 10 là, Ctrl + C không giết được các nútj duyên dáng . Tôi đã mở trình quản lý tác vụ và giết quá trình bằng tay. Các giải pháp được cung cấp trên GitHub không hiệu quả với tôi.


0

Nếu bạn sử dụng windows, thì bạn có thể kết thúc quá trình từ trình quản lý tác vụ cho node.js


0

Không có câu trả lời nào làm việc cho tôi.

Khi tôi khởi động lại máy tính, tôi có thể khởi động máy chủ.

Mac
shutdown now -r

Linux
sudo shutdown now -r


0

-> kiểm tra những gì đang chạy trên cổng 8080 hoặc những gì bạn muốn kiểm tra cổng

lsof -i @localhost:8080

Nếu một cái gì đó đang chạy bạn có thể đóng nó hoặc sử dụng một số lệnh kill để đóng nó


0

Đơn giản chỉ cần kiểm tra tạm thời của bạn trong Visual Studio Code Bởi vì tôi đang chạy ứng dụng nút của mình và tôi ngủ đông máy tính xách tay của tôi sau đó sáng hôm sau tôi bật máy tính xách tay của tôi trở lại để phát triển phần mềm. Sau đó, tôi chạy lại lệnh gật đầu app.js waas đầu tiên chạy từ đêm và lần thứ hai đang chạy lệnh mới nhất của tôi để hai dấu nhắc lệnh đang lắng nghe cùng một cổng đó là lý do tại sao bạn gặp phải vấn đề này. Đơn giản Đóng một termianl hoặc tất cả thiết bị đầu cuối, sau đó chạy nút app.js hoặc gật đầu app.js


0

Cổng bạn đang nghe đã được lắng nghe bởi một quy trình khác.

Khi tôi gặp phải lỗi này, tôi đã giết quá trình sử dụng Windows PowerShell (vì tôi đã sử dụng Windows)

  1. Liệt kê itemopen các cửa sổ powershell
  2. kiểu ps và sau đó bạn có thể nhận được danh sách các quy trình
  3. tìm quá trình có tên nút và lưu ý Id
  4. loại Stop-process <Id> tôi nghĩ rằng nó là trợ giúp cho người dùng windows

0

Tôi gặp vấn đề tương tự ngày hôm nay và cổng không được sử dụng. Cách tiếp cận sau đây đã giúp:

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

0

NẾU nó ở trong mac thì đó là tất cả về IP của x86_64-apple-darwin13.4.0. Nếu bạn theo dõi lỗi, đó sẽ là một cái gì đó liên quan đến x86_64-apple-darwin13.4.0. Thêm vào

127.0.0.1 x86_64-apple-darwin13.4.0

đến tập tin / etc / hosts . Sau đó, vấn đề đã biến mất


-1

Chỉ cần thay đổi cổng của bạn, có thể cổng hiện tại của bạn đang được sử dụng bởi iis hoặc một số máy chủ khác.


Điều này đã được hỏi và trả lời 4 năm trước với cùng một câu trả lời nhưng tốt hơn.
George
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.