Порт 3000 Node.js вже використовується, але насправді це не так?


115

Я працюю з проектом node.js вже кілька тижнів, і він чудово працює. Зазвичай я використовую npm startдля запуску свого додатка та перегляду його у браузері на localhost, порт 3000.

Сьогодні я почав отримувати таку помилку під час використання npm start:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

Я перевірив монітор ресурсів, і у мене немає іншого процесу, що працює на порту 3000. Чому я отримуватиму це повідомлення про помилку?

У моєму app.js у мене є такий код для встановлення порту ... це неправильно? Раніше це працювало нормально, тому я не впевнений, що роблю неправильно.

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

Дякую за допомогу!


Редагувати:

Я спробував запустити netstat і TCPView, щоб перевірити, який процес використовує порт, але нічого не використовує цей порт. Я також спробував перезапустити ноутбук, але все одно отримую ту ж помилку.


Існує ще один процес, який використовує цей порт, це точно. Яку ОС ви намагаєтесь? Ви можете google це як "знайти який prosess використовує порт" для вашої операційної системи
tanaydin

1
ви спробували stackoverflow.com/questions/48198/…
Ісаак

1
Значок буде кешовано. Ви також можете спробувати netstatв командному рядку або підключитися до localhost: 3000 з еквівалентом telnet - наприклад, PuTTY.
Blorgbeard вийшов

5
Я помічаю, що ви отримуєте повідомлення "Порт 3000 вже використовується" після того, як "Сервер запущений через порт 3000" - чи щось у вашій програмі намагається знову почати прослуховування на тому самому порту?
Blorgbeard вийшов

6
Я здогадуюсь, що у вас є два app.listen()заяви у вашому додатку на іншому, .listen()який також намагається запустити сервер на цьому порту. Перший працює, другий повідомляє про помилку. Шукайте свій код .listen.
jfriend00

Відповіді:


269

Ви можете шукати, як убити цей процес.

Для ОС Linux / Mac(sudo) run виконайте пошук у терміналі:

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

У Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

змінити tskillна taskkillв git bash


2
Я спробував ряд інших рішень у Windows, але цей знайшов дивний процес, що зависав порт. Заробив нагороду за включення також підходу linux на додаток до роботи над Windows.
truedat101

2
tskill не працював для мене на windows. taskkill / F / PID myPIDтут - це працює
snersesyan

2
Я нічого не отримую з лише, lsofале з тим, що sudo lsof я щось отримую, і вбивство цього процесу вирішило цю проблему.
user985366

Чи є спосіб динамічно отримати PID для запущеного процесу та вбити його? З якоїсь причини мені доводиться робити це кожного разу, коли я розгортаюся, щоб продати вручну. Примітка, переконайтеся, що це пов’язано з РМ2 чи ні.
S_W

taskkill не працював у мене на git-bash, але tskill працював. Дякую.
nickcamillo

34

Іноді це трапляється, як запропонував @sova. Іноді це трапляється зі мною, використовується EADDR. Зазвичай у фоновому режимі ховається вікно терміналу, яке все ще запускає програму. І це теж зі мною.

Буває, коли ви довго відкривали термінал, так, ви маєте право, ви зупиняєте процес. Але іноді це не зупинялося на задньому плані. Тож найкраще рішення - закрити термінал і запустити його знову. Це вирішить вашу проблему. тому що в моєму випадку це працює.

Також,

sudo lsof -i:<PORT_NO>

закрити екземпляр на даний час, але не вдалося зупинити процес у фоновому режимі. Отже, одного разу,

sudo kill <PID>

працює, але знову ж таки, коли ми оновлюємо код і зберігаємо, ця проблема виникає знову, як і у Nodemon .

Тож вихід із терміналу вирішить проблему. АБО

  killall -9 node

2
Ні lsof, ні netstat нічого не повернули, але, здається, все-таки був якийсь процес із використанням порту. Після того, як killall -9 nodeя зміг запустити сервер локально.
липня 1818 року

спасибі за команду вузла killall -9. це спрацювало на goorm IDE
ifhy

25

Можливо, ви можете взяти це як орієнтир. Цей єдиний командний рядок може знищити процес, що працює на даному порту.

npx kill-port 3000

введіть тут опис зображення


Вбивати кілька портів.

npx kill-port 3000 8080 4200

22

Для вікон Windows диспетчер завдань безумовно відображатиме процес запуску вузла. Спробуйте вбити процес, це вирішить проблему.


22

У мене була така ж проблема. (Наведені нижче кроки добре працюють у Windows 10):

  1. Відкрийте диспетчер завдань (натисніть Ctrl+ Alt+ Delete)
  2. Виберіть вкладку "Процеси"
  3. Шукати "Node.js: JavaScript на стороні сервера"
  4. Виберіть його та натисніть кнопку "Завершити завдання"

Тепер можна бігати npm start.

Сподіваюся, це допоможе вам.


7

Я бачив те саме і безперешкодно пробував усі наведені вище пропозиції. Ось такі кроки, які вирішують це для мене: - вимкнути wifi - npm start (це має працювати) - увімкнути wifi

Я точно не впевнений, що таке коренева проблема, але це вирішило це для мене.


У мене просто так трапилось і зі мною. netstat -anoнічого не
Натан,

Боже, чорт, це вирішило і для мене, оскільки, очевидно, нічого не працює на порту 3000. У мене ця проблема почалася після оновлення Windows. Ніколи не думав про вимкнення WiFi. Дякуємо, що
вирішили

7

Вбивство процесу, якому належить порт 3000

Спочатку давайте подивимось, як ми можемо вбити процес, який має відкритий порт.

За допомогою команди lsof ми можемо отримати PID, що має даний порт:

$ lsof -i :3000 -t
12345

Тоді ми можемо вбити цей процес, виконавши:

$ kill 12345

Давайте перетворимо це на однолінійний:

lsof -i 3000 -t | xargs kill

Якщо ви використовуєте змінну середовища для встановлення порту сервера, ми можемо вказати, що замість жорсткого кодування наших значень:

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

Нарешті, ми можемо за замовчуванням портувати 3000, якщо змінна середовища не встановлена:

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

Отримання нодемона для виконання гачків

Nodemon дозволяє налаштовувати перечепи подій через конфігураційний файл nodemon.json:

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

Це призведе до того, що nodemon виконує команду sh -c 'lsof -i: ${PORT:-3000} -t | xargskill щоразу, коли ваше додаток виходить з ладу, тим самим вбиваючи дочірній процес, який він породив, що підтримує порт відкритим.

або ви можете спробувати це

fuser -k PORT-NO/tcp

наприклад:

fuser -k 3000/tcp

Це досить приємне і чисте рішення для вбивства процесу. Доводиться дивитись, як це робити щоразу, і це найприємніше рішення, яке я бачив ще!
twknab

У lsof -i :3000 -t
мене

@xaunlopez спробуйте це fuser -k port-number/tcp
Afeesudheen

6

Я використовував експрес-сервер з nodemon на NodeJS. Я отримав таке повідомлення, і, схоже, помилка:

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

Існує загальне рішення, що якщо ви розірвете всі підключення до сервера вузлів, ви можете додати цей код у файл package.json:

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

Крім того, я знайшов кілька рішень windows command і bash на Win 10 x64.

Всі мої нотатки тут:


# Припиніть усі підключення до сервера 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.

# Приклад: Відкрийте диспетчер завдань Windows і перегляньте номер PID "node.exe" у Windows

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

# Убити процес у Windows за номером порту (Приклад)

Для допомоги:

$ taskkill /?
$ tskill /?

Код 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).

Код 2:

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

Код 3:

$ tskill 14228

# Командний рядок для перегляду конкретного порту

в cmd:

$ netstat -ano | find "14228"

в баші:

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

# Знайдіть node.exe за допомогою команди "Список завдань"

в cmd:

$ tasklist | find "node"

в баші:

$ 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

Це трапляється зі мною іноді, EADDR використовується. Зазвичай у фоновому режимі все ще є вікно терміналу, яке все ще працює з додатком. Ви можете зупинити процес за допомогою ctrl + C у вікні терміналу.

Або, можливо, ви прослуховуєте порт кілька разів через copy / pasta =)


Дякую за допомогу! У мене не відкрито жодного іншого вікна терміналу, ще щось слід перевірити?
користувач2573690

знайти будь-який вузол або процес npm і закінчити його. якщо у вас все ще є функція, перезавантажте машину або просто виберіть інший порт для роботи. Там дійсно немає причин він повинен бути порт 3000 або 8080
Шова

Я щойно створив нову програму для вузла і запустив її на порт 3000, і цей, здається, працює добре, але коли я намагаюся запустити свій існуючий проект, він каже, що порт використовується. Ви коли-небудь мали цю проблему?
користувач2573690

@ user2573690 я ще не стикався з цим раніше, але, можливо, у вас є кілька файлів js (наприклад, app.js та index.js), куди ви телефонуєте .listen()кілька разів?
sova

2
Дякую! Мені вдалося це зрозуміти, я кілька разів слухав порт, аварія з копією / макаронами! Якщо ви зможете відредагувати свою відповідь і додати цю частину, я позначу її. Ще раз дякую!
user2573690

5

Відкрийте диспетчер завдань (натисніть Ctrl + Alt + Del Виберіть "Вкладка процесів" Пошук "Node.js: JavaScript на стороні сервера" Виберіть його та натисніть кнопку "Завершити завдання".


2

Прийшов з Google сюди з рішенням для High Sierra.

Щось змінилося в налаштуваннях мережі macos, а деякі додатки (включаючи ping) не можуть вирішити localhost.

Редагування / etc / hosts здається виправленням:

cmd: sudo nano /etc/hosts/ вміст127.0.0.1 localhost

Або просто (якщо ви впевнені, що ваш / etc / hosts порожній) sudo echo '127.0.0.1 localhost' > /etc/hosts


2

Я витратив 2 години на з'ясування того, чому EADDRINUSEмені не дозволяють запускати додаток (інші сервіси з експрес-вузлами були в порядку) ... він почав працювати після додавання lazyConnect: true, до конфігурації джерел даних.

Не питайте мене, чому це допомогло. Я не знаю. Я розміщую цю інформацію тут лише для людей, які мають те саме питання.


підтримується готовність допомогти ТА рішення, яке може допомогти знайти першопричину.
Titou

2

У мене ця проблема виникла за допомогою Git Bash у Windows. Я біжу npm start, або node app.js. Після короткого припинення його Ctrl + C і спроби запустити сервер знову за допомогою npm startабо node app.jsтоді я отримаю це повідомлення про помилку.

Однак, коли я роблю це за допомогою звичайного командного рядка Windows , він працює добре.

Або Ви можете це зробити іншим способом. Відкрийте диспетчер завдань і знайдіть рядок " Node.js: JavaScript на стороні сервера ". Виберіть це і закінчіть завдання . Це має працювати зараз.

Дякую.


2

Якщо ви хочете закрити лише один порт, просто запустіть цю команду. kill -9 $(lsof -t -i:3000)

Різниця між pkillі чи killє хтось переробкою глини. У програмі ви застосовуєте фільтр. ти просто зупиниш потрібний порт.

pkillКоманда закриває всі процеси вузла. pkill -9 node

Використовуйте pkill, щоб уникнути витоків пам’яті, які трапляються іноді під час розробки. якщо є більше одного вузла, він вбиває їх усіх.

Приклад використання сценаріїв у package.json також є прикладом.

"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

Спробуйте відкрити localhost у своєму браузері. Просто введіть: localhost:3000в адресному рядку.

Якщо додаток відкривається, це означає, що ваш попередній npm runі раніше активний. Тепер ви можете просто внести зміни в код і побачити ефекти, якщо ви розробляєте той самий додаток, або якщо хочете запустити інший додаток, просто трохи змініть код (у index.js раніше запущеного додатка) і ( ймовірно, оновіть вкладку браузера), щоб вона вийшла npm run startз ладу;) ..... Тепер запустіть знову з нового каталогу додатків. Сподіваюся, це допомагає! :)

або

Ви можете відкрити диспетчер завдань (WINDOWS_KEY + X> диспетчер завдань), і ви побачите рядок "Node.js: JavaScript на стороні сервера". Виберіть це і закінчіть завдання .... Це повинно працювати зараз !!



Якщо ні, змініть .envфайл програми, щоб включити port:3002та запустити нову програму. Це дозволить вам запускати дві окремі програми на різних портах. Ура !!


1

Для користувачів Windows просто просто зупиніть усі процеси Node.js у диспетчері завдань

Сподіваюся, це допоможе


1

Просте в Linux

  • Відкрийте свій термінал
  • Звільнити порт від процесів -> вбити $ (lsof -t -i: $ порт)

1

Я також зіткнувся з тим же питанням. Найкращий спосіб вирішити це (для Windows) :

  1. Перейдіть до диспетчера завдань .

  2. Прокрутіть і знайдіть процес завдання з іменем. Node.js: JavaScript на стороні сервера Зображення додано для довідки

  3. Закінчіть саме це завдання.

Ось так! Тепер запустіть npm, і він буде працювати як раніше!


0

Для користувачів Windows, ви можете використовувати інструмент CurrPorts , щоб легко вбивати порти під час використання

введіть тут опис зображення


0

Це може бути процес адміністрування, який працює у фоновому режимі, і netstatцього не показує.
Використовуйте tasklist | grep nodeдля пошуку PID цього адміністраторського процесу, а потімkill PID


0

якщо ви використовуєте webstorm, просто переконайтесь, що ваш порт за замовчуванням не є 3000 з файлу -> налаштування -> Збірка, виконання, розгортання -> Налагоджувач І там зміниться

Вбудований порт сервера

і встановіть його на "63342" або подивіться цю відповідь Змінити WebStorm LiveEdit Port (63342)


0

У скриптах package.json inlcude:

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

Я вважаю, що проблема була для мене тим часом, коли старий порт вчасно не закривав Nodemon для перезавантаження. Я випробував проблему за допомогою мультера.


За необхідності відрегулюйте затримку.
Калхас,

0

Сервер або методи прослуховування програми () можуть бути додані в 2 місцях. Шукайте способи прослуховування () у запуску програми для того, щоб повернутись як Сервер розпочався в Порт XXXX, а Порт XXXX вже використовується повідомлення, що йде поруч.


0

За моїх обставин я тільки почав використовувати VS Code і дотримувався підручника з використанням Sequelize. Зрештою, у мене був файл bin / www, у якому був прослуханий (). Я не знав про це, і я запускав свою програму, запустивши node app.js, коли це не спрацювало, я потім додав у експрес-сервер речі за допомогою .listen () (що спрацювало нормально).

Але коли я почав використовувати nodemon та VSCode, він був вказаний на bin / www, і це вимагало мого app.js.

Довгого короткого оповідання я додав .listen () до свого app.js і запускав app.js безпосередньо, коли я не мав цього додавати і запускати bin / www.


0

У ubuntu спочатку захопіть процес, використовуючи номер порту: sudo lsof -i: 3000, а потім використовуйте команду kill, щоб убити процес, наприклад, якщо PID процесу дорівнює 4493, використовуйте команду: kill 4493 , для mac або windows знайдіть відповідну команду

введіть тут опис зображення


0

Я вирішив цю проблему, оскільки MongoDB або інша програма, яку раніше запускав на цьому порту, тому для її вирішення потрібно вбити процес із диспетчера завдань або просто змінити номер порту з 3000 на будь-який інший.


0

Це дуже просто. Ви можете виправити це в 2 простих кроки.

  1. Перевірте свої змінні середовища, якщо є ключ / запис із назвою "PORT".
  2. Якщо знайдено, видаліть цей запис або перейменуйте його на щось інше.

Виявляється, якась інша програма використовує цю змінну. Зазвичай, коли ви запускаєте реакційні скрипти, він шукатиме змінну середовища з таким заголовком PORT.


-1

Перш ніж запускати nodemon, спочатку запустіть mongod. Ви ніколи не отримаєте цієї помилки. :)


-2

перевірити наявність будь-якого процесу, що працює на тому самому порту, ввівши команду:

sudo ps -ef

Ви можете знайти процес, що працює на відповідному порту вузла, а потім вбити вузол за допомогою

kill -9 <node id>

Якщо проблема все-таки залишається, просто вбийте весь вузол

killall node

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.