Node.js Порт 3000 уже используется, но на самом деле это не так?

118

Я работал с проектом node.js в течение нескольких недель, и он отлично работал. Обычно я npm startзапускаю свое приложение и просматриваю его в браузере на локальном хосте, порт 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, чтобы проверить, какой процесс использует порт, но этот порт ничего не использует. Я также попытался перезагрузить ноутбук, но все равно получаю ту же ошибку.

user2573690
источник
Несомненно, есть другой процесс, который использует этот порт. Какую ОС вы пытаетесь сделать? Вы можете погуглить это как «найти, какой процесс использует порт» для вашей операционной системы
tanaydin
1
Вы пробовали stackoverflow.com/questions/48198/…
Исаак
1
Значок будет кэширован. Вы также можете попробовать netstatв командной строке или подключиться к localhost: 3000 с эквивалентом telnet - например, PuTTY.
Blorgbeard выйдет
5
Я заметил, что вы получаете сообщение «Порт 3000 уже используется» после «Сервер запущен на порту 3000» - пытается ли что-то в вашем приложении снова начать прослушивание на том же порту?
Blorgbeard выйдет
7
Я предполагаю, что у вас есть два app.listen()оператора в вашем приложении для другого, .listen()который также пытается запустить сервер на этом порту. Первый работает, второй сообщает об ошибке. Найдите в своем коде .listen.
jfriend00 05

Ответы:

273

Вы можете поискать, как убить этот процесс.

Для Linux / Mac OS найдите (sudo) runэто в терминале:

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

В Windows:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

изменить tskillдля taskkillв мерзавца Баш

Анимеш Сингх
источник
2
Я пробовал несколько других решений для Windows, но это обнаружило странный процесс, который забивал порт. Получил положительный отзыв за включение подхода Linux в дополнение к работе с Windows.
truedat101
2
tskill не работал у меня на окнах. taskkill / F / PID myPIDhere - это работает
snersesyan
2
Я ничего не получаю, lsofно с помощью sudo lsof чего-то получаю, и убийство этого процесса решило эту проблему.
user985366 09
Есть ли способ динамически получить PID для запущенного процесса и убить его? По какой-то причине мне приходится делать это каждый раз, когда я развертываю prod вручную. Боковое примечание, убедитесь, связано ли это с PM2 или нет.
S_W
taskkill у меня не работал на git-bash, но tskill работал. Спасибо.
Nickcamillo
36

Иногда это случается, как предлагала @sova. Иногда такое случается со мной, когда EADDR используется. Обычно в фоновом режиме скрывается окно терминала, в котором все еще выполняется приложение. И это тоже верно со мной.

Бывает, когда вы давно открыли терминал, да, вы имеете право, вы должны остановить процесс. Но иногда это не останавливалось на заднем плане. Поэтому лучшее решение - закрыть терминал и запустить его снова. Это решит вашу проблему. потому что в моем случае это работает.

Также,

sudo lsof -i:<PORT_NO>

закрыть экземпляр на данный момент, но не может остановить процесс в фоновом режиме. Итак, однажды

sudo kill <PID>

работает, но снова, когда мы обновляем наш код и сохраняем, эта проблема возникает снова, как и с Nodemon .

Так что выход из терминала решит проблему. ИЛИ

  killall -9 node
Techyaura
источник
2
Ни lsof, ни netstat ничего не вернули, но все же казалось, что какой-то процесс использует порт. После того, как killall -9 nodeя смог запустить сервер локально.
Julsteri
спасибо за команду узла killall -9. это сработало на goorm IDE
если так,
32

Может быть, вы можете принять это как ссылку. Эта единственная командная строка может убить процесс, запущенный на данном порту.

npx kill-port 3000

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


Чтобы убить несколько портов.

npx kill-port 3000 8080 4200
Пенни Лю
источник
1
это сработало как шарм, спасибо
Адитья Патнаик
22

Для Windows диспетчер задач определенно покажет запущенный процесс узла. Попробуйте убить процесс, это решит проблему.

ПРАКАШ ТОМАС ВАРГЕЗЕ
источник
22

У меня такая же проблема. (Следующие шаги отлично работают в Windows 10):

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

Теперь ты можешь бежать npm start.

Надеюсь, это поможет тебе.

Махьяр
источник
8

Я видел то же самое и безуспешно пробовал все предложения выше. Вот шаги, которые решают это для меня: - выключить Wi-Fi - запуск npm (это должно сработать) - включить Wi-Fi

Я не совсем уверен, в чем заключается основная проблема, но это решило ее для меня.

Джеймс Смит
источник
Это случилось и со мной. netstat -anoне перечислил ничего, использующего порт 3000.
Натан
1
Черт возьми, это решило эту проблему и для меня, поскольку очевидно, что на порту 3000 ничего не работало. У меня возникла эта проблема после обновления Windows. Никогда не думал об отключении WiFi. Спасибо за решение этой проблемы :)
3Dos
7

Я использовал экспресс-сервер с 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"

в bash:

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

# Найдите node.exe с помощью команды "tasklist"

в cmd:

$ tasklist | find "node"

в 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
Айгуныылмаз
источник
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 позволяет настраивать перехватчики событий через файл конфигурации 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
5

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

Или, возможно, вы слушаете порт несколько раз из-за копирования / пасты =)

сова
источник
Спасибо за помощь! У меня нет других открытых окон терминала, что еще я должен проверить?
user2573690 04
найти любой узел или процесс npm и завершить его. если у вас все еще есть фанк, перезагрузите компьютер или просто выберите другой порт для работы. На самом деле нет причин, по которым это должен быть порт 3000 или 8080
sova
Я только что создал новое приложение узла и запустил его на порту 3000, и он вроде работает нормально, но когда я пытаюсь запустить существующий проект, он сообщает, что порт уже используется. У вас когда-нибудь была эта проблема?
user2573690 04
@ user2573690 Я не сталкивался с этим раньше, но, возможно, у вас есть несколько файлов js (например, app.js и index.js), из которых один вызывает .listen()несколько раз?
sova
2
Спасибо! Удалось разобраться, порт несколько раз слушал, авария с копией / пастой! Если вы можете отредактировать свой ответ и добавить этот фрагмент, я отмечу его. Еще раз спасибо!
user2573690 06
5

Откройте диспетчер задач (нажмите Ctrl + Alt + Del. Выберите вкладку «Процессы». Найдите «Node.js: серверный JavaScript». Выберите его и нажмите кнопку «Завершить задачу».

Омар бахш
источник
2

Пришел сюда из Google с решением для High Sierra.

Что-то изменилось в сетевых настройках MacOS, и некоторые приложения (включая ping) не могут разрешить localhost.

Редактирование / etc / hosts похоже на исправление:

cmd: sudo nano /etc/hosts/ content127.0.0.1 localhost

Или просто (если вы уверены, что ваш / etc / hosts пуст) sudo echo '127.0.0.1 localhost' > /etc/hosts

Sznowicki
источник
2

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

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

test30
источник
проголосовали за готовность помочь И решение, которое может помочь найти первопричину.
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заключается в обработке глины. В 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:3000в адресной строке.

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

или

Вы можете открыть диспетчер задач (WINDOWS_KEY + X> Диспетчер задач), и вы увидите строку «Node.js: серверный JavaScript». Выберите это и завершите задачу .... Теперь она должна работать !!



Если нет, измените .envфайл своего приложения, чтобы включить port:3002и запустить новое приложение. Это позволит вам запускать два отдельных приложения на разных портах. Ура !!

Мохит Сингх
источник
1

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

Надеюсь, это поможет

Мухаммад Ашфак
источник
1

Просто в Linux

  • Откройте свой терминал
  • Свободный порт от процессов -> kill $ (lsof -t -i: $ port)
Обен Десмонд
источник
1

Я тоже столкнулся с той же проблемой. Лучший способ решить (для окон) :

  1. Зайдите в диспетчер задач .

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

  3. Завершите эту конкретную задачу.

Вот так! Теперь выполните npm start, и он будет работать как раньше!

Daim_Nickel_Penny
источник
0

Для пользователей Windows вы можете использовать инструмент CurrPorts , чтобы легко убить используемые порты.

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

Зухаир Таха
источник
0

Это может быть процесс администратора, работающий в фоновом режиме и netstatне показывающий этого.
Используйте, tasklist | grep nodeчтобы найти PID этого административного процесса, а затемkill PID

tnoel999888
источник
0

если вы используете webstorm, просто убедитесь, что ваш порт по умолчанию не равен 3000 из файла -> настройки -> Сборка, выполнение, развертывание -> Отладчик И там изменение

Встроенный серверный порт

и установите его на "63342" или посмотрите этот ответ. Изменить порт WebStorm LiveEdit (63342)

Мухаммад Салех
источник
0

В скриптах package.json есть:

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

Я считаю, что проблема заключалась в том, что старый порт не выключался вовремя с помощью nodemon для перезапуска. У меня возникла проблема с использованием Multer.

Калхас
источник
При необходимости отрегулируйте задержку.
Калхас
0

методы listen () сервера или приложения могут быть добавлены в двух местах. Найдите методы listen () в запускаемых приложениях, поэтому он возвращается в качестве сервера, запущенного на порте XXXX, а порт XXXX уже используется, сообщение приходит бок о бок

Ануп Джордж
источник
0

В моих обстоятельствах я только начал использовать VS Code и следовал руководству по Sequelize. В конце концов, у меня был файл bin / www, в котором был listen (). Я не знал об этом, и я запускал свое приложение, запустив 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. Проверьте переменные среды, если есть ключ / запись с именем «ПОРТ».
  2. Если найдете, удалите эту запись или переименуйте ее во что-нибудь другое.

Оказывается, эту переменную использует какая-то другая программа. Обычно, когда вы запускаете сценарий реакции, он будет искать переменную среды с таким названием PORT.

Амини-Филипс Огеленые
источник
-1

Перед запуском nodemon сначала запустите mongod. Вы никогда не получите эту ошибку. :)

Пратикша
источник
-2

проверьте, работает ли какой-либо процесс на том же порту, введя команду:

sudo ps -ef

Вы можете найти процесс, запущенный на соответствующем порту узла, а затем убить узел с помощью

kill -9 <node id>

Если проблема не исчезла, просто убейте все ноды.

killall node
Махавир
источник
-3

Убивает все запущенные порты (mac):

killall node
Райан Дангел
источник