Node/Экспресс: EADDRINUSE, адрес уже используется - Kill server

У меня есть простой сервер, работающий в node.js, используя connect:

var server = require('connect').createServer();
//actions...
server.listen(3000);

В моем коде у меня есть фактические обработчики, но это основная идея. Проблема, которую я получаю, -

EADDRINUSE, Address already in use

Я получаю эту ошибку при повторном запуске приложения после того, как он был ранее разбит или ошибки. Поскольку я не открываю новый экземпляр терминала, я закрываю процесс с помощью ctr + z.

Я уверен, что все, что мне нужно сделать, это закрыть сервер или соединение. Я пробовал звонить server.close() в process.on('exit', ...); без везения.

Ответ 1

process.on('exit', ..) не вызывается, если процесс вылетает или уничтожается. Он вызывается только тогда, когда цикл события заканчивается, и поскольку server.close() завершает цикл события (он все еще должен ждать текущих стеков здесь и там), нет смысла помещать это внутри события exit...

В случае сбоя, сделайте process.on('uncaughtException', ..) и на kill do process.on('SIGTERM', ..)

При этом SIGTERM (сигнал об отключении по умолчанию) позволяет очищать приложение, а SIGKILL (немедленное завершение) не позволит приложению ничего делать.

Ответ 2

Вы также можете перейти по маршруту командной строки:

ps aux | grep node

чтобы получить идентификаторы процесса.

Тогда:

kill -9 PID

Выполнение -9 на kill отправляет SIGKILL (вместо SIGTERM). SIGTERM для меня иногда игнорировался node.

Ответ 3

Я нашел для меня самый быстрый способ разрешить это:

killall node

Ответ 4

Я ударил это на своем ноутбуке, работающем с win8. это сработало.

Запустите cmd.exe как "Администратор":

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Ответ 5

Сначала вы хотели бы знать, какой процесс использует port 3000

sudo lsof -i :3000

в этом списке будет отображаться все PID, прослушивающие этот порт, как только у вас есть PID, вы можете его завершить следующим образом:

kill -9 {PID}

Ответ 6

Проверьте идентификатор PID, то есть идентификатор процесса, запущенного на порту 3000, с помощью команды ниже:

lsof -i tcp:3000

Он выводит что-то вроде следующего:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Теперь убейте процесс, используя:

kill -9 5805

Ответ 7

Я нашел это решение, попробуйте дать разрешение на использование sudo

  sudo pkill node

Ответ 8

Linux

Запустите ps и определите PID вашего процесса узла.

Затем запустите sudo kill PID

Windows

Используйте список задач для отображения списка запущенных процессов:

tasklist /O

Затем завершите процесс узла следующим образом (используя PID, полученный из команды tasklist):

taskkill /pid PID

Ответ 9

Я получал эту ошибку один раз и использовал многие из этих подходов.

Мои проблемы состояли в том, что у меня было два вызова app.listen(3000); в том же app.js script. Первый app.listen() преуспел там, где второй сбросил ошибку.

Еще одна полезная команда, с которой я столкнулся, помогла мне отладить sudo fuser -k 3000/tcp, которая убьет любые запущенные процессы, которые вы могли бы запустить (некоторые процессы могут перезагружаться, например, если они запускаются с forever.js, но это было полезно для меня).

Ответ 10

Вот один вкладыш (замените 3000 на порт или переменную конфигурации):

kill $(lsof -t -i:3000)

Ответ 11

Для окон откройте диспетчер задач и найдите процессы node.exe. Убейте их всех с помощью End Task.

enter image description here

Ответ 12

FYI, вы можете убить процесс в одной команде sudo fuser -k 3000/tcp. Это можно сделать для всех других портов, таких как 8000, 8080 или 9000, которые обычно используются для разработки.

Ответ 13

Пользователи PowerShell:

Taskkill/IM node.exe/F

Ответ 14

если вы используете Mac или Linux, вы можете попробовать эту команду на терминале

 killall node

Ответ 15

Сначала узнайте, что работает, используя:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Вы получите что-то вроде:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Затем вы можете убить процесс следующим образом:

sudo kill 110

Тогда вы сможете работать без ошибок EADDRINUSE: 3000 listen

Ответ 16

Диспетчер задач (ctrl + alt + del) →

Вкладка "Процессы" →

выберите "node.exe" и нажмите "Завершить процесс"

Ответ 17

Для Visual Studio Noobs, как я

Возможно, вы запускаете процесс в других терминалах!

После закрытия терминала в Visual Studio терминал просто исчезает.

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

Итак, я нашел первый терминал и... Вуаля, я работал там на сервере.

multiple terminals withot realizying it

Ответ 18

Вы можете использовать hot- node, чтобы предотвратить ошибки сервера/ошибки времени выполнения. Горячая node автоматически перезапускает приложение nodejs для вас всякий раз, когда происходит изменение в программе node [источник]/процесс [запуск node program].

Установите hot- node с помощью npm, используя глобальную опцию:

npm install -g hotnode

Ответ 19

ps aux | grep node
kill -9 [PID] (provided by above command)

Описание:


  1. ps предоставит статус процесса, aux предоставит список: все процессы пользователя, u: процессы пользователя, x: все остальные процессы, не подключенные к терминалу.
  2. символ pipes: | передаст результат ps aux для дальнейшей манипуляции.
  3. grep будет искать предоставленную строку (в нашем случае это узел) из списка, предоставленного ps aux.

Ответ 20

При должном уважении ко всем ответам в форме я хотел бы добавить точку.

Я обнаружил, что когда я заканчиваю приложение node при ошибке с помощью Ctrl + Z, то в следующий раз, когда я пытаюсь открыть его, вы получаете ту же ошибку EADDRINUSE.

Когда я использую Ctrl + C для завершения приложения node, в следующий раз, когда я его открыл, он сделал это без сучка и задоринки.

Изменение номера порта на что-то другое, кроме ошибки, вызвало проблему.

Ответ 21

На всякий случай проверьте, добавили ли вы эту строку несколько по ошибке

app.listen(3000, function() {
  console.log('listening on 3000')
});

Вышеприведенный код предназначен для экспресс-проверки, но просто проверьте, пытаетесь ли вы дважды использовать один и тот же порт в своем коде.

Ответ 22

В Linux.

Добавить функцию в ~/.bashrc:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Измените изменения: source ~/.bashrc

И используйте его: killTcpListen 3000

Ответ 23

Win10, git bash v2.15, node v8.9.1, npm v5.5.1

У меня был пакет package.json script, чтобы запустить node: "start": "node index.js"

Всякий раз, когда я использовал это, независимо от того, убил ли я его с помощью ctrl + c, я столкнулся с этой проблемой.

Если я просто запустил node index.js из git bash вместо npm run start и убил ctrl + c, я никогда не получал эту ошибку.

Я не уверен, почему, но я решил, что это может помочь кому-то.

Ответ 24

Node работает где-то в памяти и заблокирован этот порт. В Windows эта проблема, как и большинство проблем Windows, будет решена путем нажатия CTRL + ALT + DEL и/или перезагрузки.

Ответ 25

Причины этих проблем:

  • На этом порту, как Skype, может работать любое одно приложение.
  • Node может быть разбит, и порт, возможно, не был освобожден.
  • Возможно, вы попытались запустить сервер более одного. Чтобы решить эту проблему, можно поддерживать логическое значение, чтобы проверить, запущен ли сервер или нет. Его следует запускать только в том случае, если boolean возвращает false или undefined;

Ответ 26

Возможно, вы используете несколько серверов. Вы можете закрыть их и использовать один сервер. В Linux вы можете использовать команду killall node.

Ответ 27

server.close() занимает некоторое время, чтобы закрыть соединение, поэтому мы должны сделать это асинхронным вызовом как таковым:

await server.close();

ВАЖНО: при использовании await мы должны использовать ключевое слово async в нашей функции инкапсуляции как таковой:

async () => {
  await server.close();
}

Ответ 28

Вы можете столкнуться со сценариями, в которых даже уничтожение потока или процесса не приведет к прекращению работы приложения (это иногда случается со мной в Linux и Windows). Иногда у вас уже может быть запущен экземпляр, который вы не закрыли.

В результате таких обстоятельств я предпочитаю добавить в свой package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Затем я могу позвонить им, используя:

npm run stop-win
npm run stop-Linux

При желании вы можете сделать это и сделать эти команды BIN с флагом аргумента. Вы также можете добавить их в качестве команд для выполнения в предложении try-catch.

Ответ 29

Будьте осторожны, что, как и я, у вас нет другого окна DOS (или подобного), которое вы забыли о x)

Он произвел точную ошибку, показанную выше!

Ответ 30

Это означает, что у вас есть два сервера node, работающих на одном и том же порту, если один из них работает на порту, скажем, 3000, изменив другой на другой порт, скажем 3001, и все будет хорошо работать