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



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



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


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



EADDRINUSE, Address already in use


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



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

1159   28  

28 ответов:

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

на аварии, сделать process.on('uncaughtException', ..) а на убийство пойду process.on('SIGTERM', ..)

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

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

ps aux | grep node

получить ID процесса.

затем:

kill -9 PID

делаем -9 на Kill посылает сигнал SIGKILL (а не прекращается). SIGTERM иногда игнорируется node для меня.

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

killall node

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

Выполнить cmd.exe как 'администратор':

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

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

sudo lsof -i :3000

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

kill -9 {PID}

Проверьте PID т. е. id процесса, работающего на порту 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

вы на linux или windows? Если на linux тип:ps и проверьте PID вашего процесса узла.

затем, sudo kill PID

EDIT: Для Windows:

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

tasklist /O

а затем убить процесс узла, как так (PID, полученный из ):

taskkill /pid PID

Я нашел это решение, попробуй

  pkill node

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

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

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

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

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

узел Taskkill /IM.exe / F

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

 killall node

На Linux.

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

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

вытянуть изменения: source ~/.bashrc

и использовать его: killTcpListen 3000

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

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

npm install-g hotnode

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

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

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

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

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

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

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

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

Win10, git bash v2.15, узел v8.9.1, npm v5.5. 1

у меня был пакет.скрипт json для запуска узла:"start": "node index.js"

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

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

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

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

вкладка "процессы" ->

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

причины этой проблемы являются:

  1. любое приложение может работать на этом порту, как Skype.
  2. возможно, узел разбился и порт не был освобожден.
  3. возможно, вы пытались запустить сервер более одного. Чтобы решить эту проблему, можно поддерживать логическое значение, чтобы проверить, запущен ли сервер или нет. Он должен быть запущен только в том случае, если boolean возвращает false или undefined;

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

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

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

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

интересно, почему никто еще не упомянул об этой возможности:

  • если вы предоставите ::listen(port) со строкой (намеренно или нет), которая не была бы допустимым представлением номера порта, она затем может быть внутренне преобразована в номер порта -1, муравей тогда двигатель будет пытаться подключиться к этому -1 порт, который затем дает то же EADDRINUSE ошибка, которая в свою очередь может немного запутать и повернуть вас в неправильном направлении для поиска исправления ошибок (привет, меня xD).

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

Я тоже получил тот же вопрос.

  • закройте все приглашения cmd или Git bash в диспетчере задач

Если это не сработало перезагрузите систему

в другом сценарии мне пришлось установить последний узел и дать npm install как администратору, он работал.

для всех, кто пришел на этот пост и попробовал все, возможно, используя nodemon или навсегда, чтобы сделать это. Например, если вы запустите PORT=6060 Nodemon Вы можете получить ту же ошибку, что порт 6060 уже используется.

Если это так, просто запустите свой проект без nodemon, если вам действительно нужно определить порт во время запуска. Кроме того, вы можете определить порт в самом файле, если вы хотите придерживаться nodemon.

для меня я делаю это сейчас PORT=6060 node app.js

вот один лайнер (замена 3000 с портом или переменной config):

kill $(lsof -t -i:3000)

эта команда перечисляет задачи, связанные с "узлом", и каждая из них завершается.

kill -9  $( ps -ae | grep 'node' | awk '{print }')

Comments

    Ничего не найдено.