Узел / Экспресс: EADDRINUSE, адрес уже используется-Kill server
у меня есть простой сервер, работающий в узле.Яш, используя подключение:
var server = require('connect').createServer();
//actions...
server.listen(3000);
в моем коде у меня есть обработчики, но это основная идея. Проблема, которую я продолжаю получать это
EADDRINUSE, Address already in use
я получаю эту ошибку при запуске моего приложения снова после того, как он ранее разбился или ошибки. Поскольку я не открываю новый экземпляр терминала, я закрываю процесс с помощью ctr + z.
я совершенно уверен, что все, что мне нужно сделать, это закрыть сервер или соединение. Я попытался звоню server.close() на process.on('exit', ...); не повезло.
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 для меня.
Я ударил это на своем ноутбуке под управлением win8. это сработало.
Выполнить cmd.exe как 'администратор':
C:\Windows\System32>taskkill /F /IM node.exe SUCCESS: The process "node.exe" with PID 11008 has been terminated.
во-первых, вы хотели бы знать, какой процесс использует
port 3000sudo 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 PIDEDIT: Для Windows:
использовать tasklist для отображения списка запущенных процессов:
tasklist /Oа затем убить процесс узла, как так (PID, полученный из ):
taskkill /pid PID
Я получал эту ошибку один раз и взял многие из подходов здесь.
мои проблемы были в том, что у меня было два
app.listen(3000);вызовы в том же приложении.JS скрипт. первое приложение.listen () преуспел там, где второй бросил ошибку.еще одна полезная команда, с которой я столкнулся, которая помогла мне отладить, была
sudo fuser -k 3000/tcpкоторый убьет любые изгоев процессы, которые вы могли бы начать (некоторые процессы могут перезапустить, например, если работать с forever.JS, но это было полезно для меня).
FYI, вы можете убить процесс в одной команде
sudo fuser -k 3000/tcp. Это может быть сделано для всех других портов, таких как 8000, 8080 или 9000, которые обычно используются для разработки.
На 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 "процесс и нажмите "Завершить процесс"
причины этой проблемы являются:
- любое приложение может работать на этом порту, как Skype.
- возможно, узел разбился и порт не был освобожден.
- возможно, вы пытались запустить сервер более одного. Чтобы решить эту проблему, можно поддерживать логическое значение, чтобы проверить, запущен ли сервер или нет. Он должен быть запущен только в том случае, если 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
эта команда перечисляет задачи, связанные с "узлом", и каждая из них завершается.
kill -9 $( ps -ae | grep 'node' | awk '{print }')
Comments