Cổng Node.js 3000 đã được sử dụng nhưng thực tế thì không?


114

Tôi đã làm việc với một dự án node.js trong một vài tuần và nó đã hoạt động rất tốt. Thông thường, tôi sử dụng npm startđể chạy ứng dụng của mình và xem nó trong trình duyệt trên localhost, cổng 3000.

Hôm nay, tôi bắt đầu gặp lỗi sau khi sử dụng npm start:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

Tôi đã kiểm tra trình giám sát tài nguyên và tôi không có tiến trình nào khác đang chạy trên cổng 3000. Tại sao tôi lại nhận được thông báo lỗi này?

Trong app.js của tôi, tôi có mã sau để đặt cổng ... điều này có sai không? Trước đây nó hoạt động tốt nên tôi không chắc mình đang làm gì sai.

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

Cảm ơn đã giúp đỡ!


BIÊN TẬP:

Tôi đã thử chạy netstat và TCPView để kiểm tra quá trình nào đang sử dụng cổng, nhưng không có gì sử dụng cổng đó. Tôi cũng đã thử khởi động lại máy tính xách tay của mình nhưng tôi vẫn gặp lỗi tương tự.


Có một quy trình khác sử dụng cổng này, nó là chắc chắn. Bạn đang cố gắng làm điều hành nào? Bạn có thể google nó giống như 'tìm mà sử dụng prosess cổng' cho hệ điều hành của bạn
tanaydin


1
Biểu tượng yêu thích sẽ được lưu vào bộ nhớ đệm. Bạn cũng có thể thử netstattrong một dấu nhắc lệnh hoặc kết nối với localhost: 3000 bằng telnet tương đương - ví dụ như PuTTY.
Blorgbeard ra mắt

5
Tôi nhận thấy bạn nhận được "Cổng 3000 đã được sử dụng" sau khi "Máy chủ đã khởi động trên cổng 3000" - có thứ gì đó trong ứng dụng của bạn đang cố gắng bắt đầu nghe lại trên cùng một cổng không?
Blorgbeard ra

6
Tôi đoán là bạn có hai app.listen()câu lệnh trong ứng dụng của mình trên một ứng dụng khác .listen()cũng đang cố gắng khởi động máy chủ trên cổng đó. Cái thứ nhất hoạt động, cái thứ hai báo lỗi. Tìm kiếm mã của bạn cho .listen.
jfriend00

Câu trả lời:


269

Bạn có thể tìm kiếm cách để loại bỏ quá trình đó.

Đối với Linux / Mac OS, hãy tìm kiếm (sudo) runđiều này trong terminal:

$ lsof -i tcp:3000
$ kill -9 PID

Trên Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

đổi tskilllấy taskkilltrong git bash


2
Tôi đã thử một số giải pháp khác trên windows, nhưng giải pháp này đã tìm thấy quá trình kỳ lạ đang gây tắc nghẽn cổng. Đã kiếm được một sự ủng hộ vì bao gồm cả cách tiếp cận linux ngoài việc làm việc trên windows.
truedat101

2
tskill không làm việc cho tôi trên windows. taskkill / F / PID myPIDhere - làm việc này
snersesyan

2
Tôi không nhận được gì với chỉ lsofnhưng với việc sudo lsof tôi nhận được thứ gì đó, và việc giết quá trình đó đã giải quyết được vấn đề này.
user985366

Có cách nào để tự động lấy PID cho quá trình đang chạy và giết nó không? Vì một số lý do, tôi phải làm điều này mỗi khi triển khai sản xuất thủ công. Lưu ý bên, chắc chắn nếu điều này có liên quan đến PM2 hay không.
S_W

taskkill không hoạt động với tôi trên git-bash, nhưng tskill thì có. cảm ơn.
nickcamillo

34

Đôi khi nó xảy ra, như @sova đã đề xuất Điều này đôi khi xảy ra với tôi, EADDR đang được sử dụng. Thông thường, có một cửa sổ dòng lệnh ẩn trong nền vẫn đang chạy ứng dụng. Và điều đó cũng đúng với tôi.

Nó xảy ra, khi bạn đã mở thiết bị đầu cuối trong một thời gian dài, vâng bạn có quyền, bạn đã dừng quá trình. Nhưng đôi khi nó không dừng lại ở chế độ nền. Vì vậy, giải pháp tốt nhất là bạn đóng thiết bị đầu cuối và khởi động lại. Nó sẽ giải quyết vấn đề của bạn. becuase trong trường hợp của tôi nó hoạt động.

Cũng thế,

sudo lsof -i:<PORT_NO>

đóng phiên bản cho thời điểm hiện tại nhưng không thể dừng quá trình trong nền. Vì vậy, một lần,

sudo kill <PID>

hoạt động, nhưng một lần nữa khi chúng tôi cập nhật mã và lưu, sự cố này lại xảy ra như với Nodemon .

Vì vậy, thoát khỏi thiết bị đầu cuối sẽ giải quyết được vấn đề. HOẶC LÀ

  killall -9 node

2
Cả lsof hoặc netstat đều không trả lại bất cứ điều gì, nhưng dường như vẫn có một số quá trình sử dụng cổng. Sau khi killall -9 nodetôi có thể chạy máy chủ cục bộ.
Julsteri

cảm ơn vì lệnh killall -9 node. nó hoạt động trên goorm IDE
ifhy

24

Có lẽ bạn có thể coi đây là tài liệu tham khảo. Dòng lệnh đơn này có thể giết tiến trình đang chạy trên một cổng nhất định.

npx kill-port 3000

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


Để giết nhiều cổng.

npx kill-port 3000 8080 4200

22

Đối với windows, Trình quản lý tác vụ chắc chắn sẽ hiển thị một tiến trình nút đang chạy. Cố gắng giết quá trình, nó sẽ giải quyết được vấn đề.


22

Tôi đã từng gặp vấn đề tương tự. (Các bước dưới đây hoạt động tốt trên Windows 10):

  1. Mở Trình quản lý tác vụ (nhấn Ctrl+ Alt+ Delete)
  2. Chọn 'tab Quy trình'
  3. Tìm kiếm 'Node.js: JavaScript phía máy chủ'
  4. Chọn nó và nhấp vào nút 'Kết thúc nhiệm vụ'

Bây giờ bạn có thể chạy npm start.

Hy vọng nó sẽ giúp bạn.


7

Tôi đã thấy điều tương tự và đã thử tất cả các đề xuất ở trên mà không thành công. Đây là các bước giải quyết nó cho tôi: - tắt wifi - npm start (điều này sẽ hoạt động) - bật wifi

Tôi không chắc chính xác vấn đề gốc là gì nhưng điều đó đã giải quyết cho tôi.


Tôi cũng đã có điều này xảy ra với tôi. netstat -anokhông liệt kê bất cứ điều gì bằng cách sử dụng cổng 3000.
Nathan

Chúa ơi, điều này cũng giải quyết được nó cho tôi vì rõ ràng là không có gì đang chạy trên cổng 3000. Tôi bắt đầu gặp sự cố này sau khi cập nhật Windows. Chưa bao giờ nghĩ đến việc tắt WiFi. Cảm ơn bạn đã giải quyết vấn đề này :)
3Dos

7

Hủy quy trình sở hữu cổng 3000

Đầu tiên, chúng ta hãy xem cách chúng ta có thể giết một tiến trình có một cổng đang mở.

Sử dụng lệnh lsof, chúng ta có thể truy xuất PID có cổng đã cho:

$ lsof -i :3000 -t
12345

Sau đó, chúng ta có thể giết quá trình này chỉ bằng cách:

$ kill 12345

Hãy biến điều này thành một lớp lót:

lsof -i 3000 -t | xargs kill

Nếu bạn đang sử dụng một biến môi trường để đặt cổng máy chủ, chúng tôi có thể chỉ định biến đó thay vì mã hóa cứng các giá trị của chúng tôi:

lsof -i ${PORT} -t | xargs kill

Cuối cùng, chúng ta có thể đặt mặc định là cổng 3000 nếu biến môi trường không được đặt:

lsof -i ${PORT:-3000} -t | xargs kill

Bắt gật đầu thực thi hook

Nodemon cho phép bạn thiết lập móc sự kiện thông qua tệp cấu hình gật đầu.json:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

Điều này sẽ khiến cho gật đầu thực thi lệnh sh -c 'lsof -i: ${PORT:-3000} -t | xargskill bất cứ khi nào ứng dụng của bạn gặp sự cố, do đó giết chết tiến trình con mà nó sinh ra đang giữ cho cổng mở.

hoặc bạn có thể thử cái này

fuser -k PORT-NO/tcp

ví dụ:

fuser -k 3000/tcp

Đây là một giải pháp khá tốt và sạch để giết một quy trình. Phải tìm cách thực hiện điều này mọi lúc, và đây là giải pháp tốt nhất mà tôi từng thấy!
twknab

Tôi đang gặp sự cố này mặc dù không có quy trình nào quay lại từ lsof -i :3000 -t= \
xaunlopez

@xaunlopez hãy thử cái này fuser -k port-number/tcp
Afeesudheen

6

Tôi đang sử dụng máy chủ express với gật đầu trên NodeJS. Tôi nhận được thông báo sau và có vẻ như đã xảy ra lỗi:

$ node ./bin/www
Port 3000 is already in use

Có một giải pháp chung là nếu bạn chấm dứt tất cả các kết nối máy chủ nút, bạn có thể thêm mã này vào tệp package.json của mình:

"scripts": {
    "start": "node ./bin/www",
    "stop": "taskkill -f -im node.exe"
},

Ngoài ra, tôi đã tìm thấy một số giải pháp lệnh windows và bash trên Win 10 x64.

Tất cả các ghi chú của tôi đều ở đây:


# Chấm dứt tất cả các Kết nối Máy chủ NodeJS

$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.

# Ví dụ: Mở Trình quản lý Tác vụ Windows và xem số PID "node.exe" trên Windows

>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano

# Giết một tiến trình trong Windows bằng Số cổng (Ví dụ)

Để được giúp đỡ:

$ taskkill /?
$ tskill /?

Mã 1:

$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

Mã 2:

$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.

Mã 3:

$ tskill 14228

# Dòng lệnh để xem cổng cụ thể

trong cmd:

$ netstat -ano | find "14228"

trong bash:

$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228

# Tìm node.exe bằng lệnh "tasklist"

trong cmd:

$ tasklist | find "node"

trong bash:

$ tasklist | grep node
$ tasklist | grep node.exe
node.exe                     14228 Console                    2     48,156 K
node.exe                     15236 Console                    2     24,776 K
node.exe                     19364 Console                    2     24,428 K

5

Điều này đôi khi xảy ra với tôi, EADDR đang được sử dụng. Thông thường, có một cửa sổ dòng lệnh ẩn trong nền vẫn đang chạy ứng dụng. Bạn có thể dừng quá trình bằng ctrl + C trong cửa sổ dòng lệnh.

Hoặc có lẽ bạn đang nghe port nhiều lần do copy / pasta =)


Cảm ơn đã giúp đỡ! Tôi không có bất kỳ cửa sổ đầu cuối nào khác đang mở, tôi cần kiểm tra bất kỳ điều gì khác?
user2573690

tìm bất kỳ nút hoặc quy trình npm nào và kết thúc nó. nếu bạn vẫn có funk, hãy khởi động lại máy hoặc chỉ cần chọn một cổng khác để làm việc. Thực sự không có lý do gì nó phải là cổng 3000 hoặc 8080
sova

Tôi vừa tạo một ứng dụng nút mới và khởi động nó trên cổng 3000 và ứng dụng đó có vẻ hoạt động tốt, nhưng khi tôi cố gắng chạy dự án hiện có của mình, nó cho biết cổng đang được sử dụng. Bạn đã bao giờ gặp vấn đề này chưa?
dùng2573690

@ user2573690 Tôi chưa từng gặp nó trước đây, nhưng có thể bạn có nhiều tệp js (như app.js và index.js) trong đó một tệp đang gọi .listen()nhiều lần?
sova

2
Cảm ơn bạn! Tôi cố gắng tìm ra nó, tôi đã nghe cổng nhiều lần, tai nạn sao chép / mì ống! Nếu bạn có thể chỉnh sửa câu trả lời của mình và thêm đoạn đó, tôi sẽ đánh dấu nó. Một lần nữa, xin cảm ơn!
dùng2573690

5

Mở Trình quản lý tác vụ (nhấn Ctrl + Alt + Del Chọn 'Tab Xử lý' Tìm kiếm 'Node.js: JavaScript phía máy chủ' Chọn nó và nhấp vào nút 'Kết thúc tác vụ'


2

Đến từ Google ở ​​đây với một giải pháp cho High Sierra.

Có điều gì đó đã thay đổi trong thiết lập mạng của macos và một số ứng dụng (bao gồm cả ping) không thể giải quyết localhost.

Chỉnh sửa / etc / hosts dường như là một bản sửa lỗi:

cmd: sudo nano /etc/hosts/ nội dung127.0.0.1 localhost

Hoặc đơn giản hơn (nếu bạn chắc chắn / etc / hosts của mình trống) sudo echo '127.0.0.1 localhost' > /etc/hosts


2

Tôi đã dành 2 giờ để tìm hiểu lý do tại sao EADDRINUSEkhông cho phép tôi khởi động một ứng dụng (các máy chủ node-express khác vẫn ổn) ... nó bắt đầu hoạt động sau khi thêm lazyConnect: true, vào cấu hình nguồn dữ liệu.

Đừng hỏi tôi tại sao nó lại giúp ích. Tôi không biết. Tôi đặt thông tin này ở đây chỉ dành cho những người có cùng vấn đề.


ủng hộ cho sự sẵn lòng giúp đỡ VÀ một giải pháp có thể giúp tìm ra nguyên nhân gốc rễ.
Titou

2

Tôi gặp sự cố này khi sử dụng Git Bash trên Windows. Tôi chạy npm start, hoặc node app.js. Sau khi kết thúc nó bằng Ctrl + C trong thời gian ngắn và cố gắng khởi động lại máy chủ bằng cách sử dụng npm starthoặc node app.jssau đó tôi nhận được thông báo lỗi này.

Tuy nhiên, khi tôi thực hiện việc này với Command Prompt thông thường của Windows , nó hoạt động tốt.

Hoặc Bạn có thể làm theo cách khác. Mở Trình quản lý Tác vụ và Tìm hàng " Node.js: JavaScript phía máy chủ ". Chọn nhiệm vụ đó và kết thúc . Nó sẽ hoạt động ngay bây giờ.

Cảm ơn.


2

Nếu bạn chỉ muốn đóng một cổng, chỉ cần chạy lệnh này. kill -9 $(lsof -t -i:3000)

Sự khác biệt giữa pkillkilllà ai đó xử lý đất sét. Cuối cùng, bạn áp dụng một bộ lọc. bạn chỉ cần dừng cổng bạn muốn.

Các pkilllệnh đóng cửa tất cả các quá trình nút. pkill -9 node

Sử dụng pkill để tránh rò rỉ bộ nhớ thỉnh thoảng xảy ra trong quá trình phát triển. nếu có nhiều hơn một nút, nó sẽ giết tất cả chúng.

Việc sử dụng các tập lệnh trong package.json cũng được minh họa.

"scripts": {
    "server:start": "cd server && yarn start",
    "server:restart": "cd server && yarn restart",
    "frontend:start": "cd frontend && yarn start",
    "frontend:restart": "kill -9 $(lsof -t -i:4200) && yarn start:frontend"
},
"scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts",
    "restart": "pkill -9 node && start",
    "kill": "pkill -9 node"
},

1

Hãy thử mở localhost trong trình duyệt của bạn. Chỉ cần nhập: localhost:3000vào thanh địa chỉ.

Nếu ứng dụng mở ra, điều đó có nghĩa là ứng dụng trước đó của bạn npm runvẫn đang hoạt động. Bây giờ, bạn chỉ có thể thực hiện các thay đổi đối với mã và xem các hiệu ứng nếu bạn đang thiết kế cùng một ứng dụng hoặc nếu bạn muốn chạy một ứng dụng khác, chỉ cần chỉnh sửa mã (trong index.js của ứng dụng đang chạy trước đó) một chút và ( có thể là làm mới tab trình duyệt) để làm cho nó bị lỗi;) ..... Bây giờ hãy chạy npm run startlại từ thư mục ứng dụng mới của bạn. Hi vọng điêu nay co ich! :)

hoặc là

Bạn có thể mở Trình quản lý tác vụ (WINDOWS_KEY + X> Trình quản lý tác vụ) và bạn sẽ thấy hàng "Node.js: JavaScript phía máy chủ". Chọn nhiệm vụ đó và kết thúc .... Nó sẽ hoạt động ngay bây giờ !!



Nếu không, hãy thay đổi .envtệp ứng dụng của bạn để bao gồm port:3002và chạy ứng dụng mới. Điều này sẽ cho phép bạn chạy hai ứng dụng riêng biệt trên các cổng khác nhau. Chúc mừng !!


1

Đối với người dùng windows, chỉ cần dừng tất cả các quy trình của Node.js trong Task Manager

Hy vọng nó sẽ giúp ích


1

Đơn giản trong Linux

  • Mở thiết bị đầu cuối của bạn
  • Cổng miễn phí từ các quy trình -> kill $ (lsof -t -i: $ port)

1

Tôi cũng gặp phải vấn đề tương tự. Cách tốt nhất để giải quyết là (dành cho windows) :

  1. Chuyển đến Trình quản lý tác vụ .

  2. Cuộn và tìm một quy trình tác vụ được đặt tên. Node.js: JavaScript phía máy chủ Đã thêm hình ảnh để tham khảo

  3. Kết thúc nhiệm vụ cụ thể này.

Của bạn đây! Bây giờ hãy bắt đầu npm và nó sẽ hoạt động như trước!


0

Đối với người dùng windows, bạn có thể sử dụng công cụ CurrPorts để loại bỏ các cổng đang sử dụng một cách dễ dàng

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


0

Nó có thể là một quá trình quản trị đang chạy trong nền và netstatkhông hiển thị điều này.
Sử dụng tasklist | grep nodeđể tìm PID của quy trình quản trị này và sau đókill PID


0

Nếu bạn đang sử dụng webstorm, chỉ cần đảm bảo rằng cổng mặc định của bạn không phải là 3000 từ tệp -> cài đặt -> Xây dựng, Thực thi, Triển khai -> Trình gỡ lỗi và có thay đổi

Cổng máy chủ tích hợp

và đặt nó thành "63342" hoặc xem câu trả lời này Thay đổi cổng WebStorm LiveEdit (63342)


0

Trong tập lệnh package.json inlcude:

"start": "nodemon app.js --delay 1500ms"

Tôi tin rằng vấn đề là đối với tôi khi cổng cũ không tắt kịp thời bởi gật đầu để khởi động lại. Tôi đã gặp sự cố khi sử dụng multer.


Điều chỉnh độ trễ theo yêu cầu.
Kalkhas

0

phương thức máy chủ hoặc ứng dụng nghe () có thể được thêm vào 2 nơi. Tìm kiếm các phương thức nghe () trong phần khởi động ứng dụng, đó là lý do tại sao nó trả về khi Máy chủ bắt đầu ở Cổng XXXX và thông báo Cổng XXXX đã được sử dụng song song với nhau


0

Trong hoàn cảnh của tôi, tôi mới bắt đầu sử dụng VS Code và đã làm theo hướng dẫn sử dụng Sequelize. Cuối cùng, tôi đã có một tệp bin / www có hàm nghe () trong đó. Tôi không biết về điều này và tôi đang chạy ứng dụng của mình bằng cách chạy node app.js, khi nó không hoạt động, sau đó tôi đã thêm vào nội dung máy chủ express với .listen () (hoạt động tốt).

Nhưng khi bắt đầu sử dụng gật đầu và VSCode, nó đã được trỏ tới bin / www và điều đó yêu cầu app.js của tôi.

Câu chuyện ngắn tôi đã thêm .listen () vào app.js của mình và đang chạy app.js trực tiếp khi đáng lẽ tôi không nên thêm nó và chạy bin / www.


0

Trong ubuntu, trước tiên hãy lấy quá trình bằng cách sử dụng số cổng: sudo lsof -i: 3000 sau đó sử dụng lệnh kill để hủy quá trình, ví dụ: nếu PID của quá trình là 4493 thì lệnh sử dụng: kill 4493 , đối với mac hoặc windows tìm lệnh liên quan

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


0

Tôi đã giải quyết vấn đề này vì MongoDB hoặc có một ứng dụng khác mà bạn đã chạy trước đó trên cổng này, vì vậy, để giải quyết nó, hãy giết quá trình từ trình quản lý tác vụ hoặc chỉ cần thay đổi số cổng từ 3000 thành bất kỳ cổng nào khác.


0

Nó rất đơn giản. Bạn có thể sửa nó trong 2 bước đơn giản.

  1. Kiểm tra các biến môi trường của bạn nếu có một khóa / mục nhập có tên "PORT".
  2. Nếu tìm thấy, hãy xóa mục nhập đó hoặc đổi tên thành mục khác.

Nó chỉ ra rằng một số chương trình khác đang sử dụng biến đó. Thông thường, khi bạn bắt đầu các kịch bản phản ứng, nó sẽ tìm kiếm một biến môi trường có tiêu đề là PORT.


-1

Trước khi chạy gật đầu, hãy khởi động mongod trước. Bạn sẽ không bao giờ gặp lỗi này. :)


-2

kiểm tra xem có quá trình nào đang chạy trên cùng một cổng hay không bằng cách nhập lệnh:

sudo ps -ef

Bạn có thể tìm thấy tiến trình đang chạy trên cổng nút tương ứng, sau đó hủy nút bằng cách

kill -9 <node id>

Nếu sự cố vẫn còn thì chỉ cần giết tất cả các nút

killall node

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.