Как исправить ошибку: слушать EADDRINUSE при использовании nodejs?
Если я запускаю сервер с портом 80 и пытаюсь использовать xmlHTTPrequest, я получаю эту ошибку: Error: listen EADDRINUSE
Почему это проблема для nodejs, если я хочу сделать запрос, пока я запускаю сервер на порту 80? Для веб-браузеров это не проблема: я могу путешествовать по Интернету, пока сервер работает.
Сервер является:
net.createServer(function (socket) {
socket.name = socket.remoteAddress + ":" + socket.remotePort;
console.log('connection request from: ' + socket.remoteAddress);
socket.destroy();
}).listen(options.port);
И просьба:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
sys.puts("State: " + this.readyState);
if (this.readyState == 4) {
sys.puts("Complete.\nBody length: " + this.responseText.length);
sys.puts("Body:\n" + this.responseText);
}
};
xhr.open("GET", "http://mywebsite.com");
xhr.send();
46 ответов
EADDRINUSE
означает, что номер порта, который listen()
пытается привязать сервер к уже используемому.
Итак, в вашем случае, должен быть запущен сервер уже на 80-м порту.
Если у вас есть другой веб-сервер, работающий на этом порту, вы должны поместить node.js за этим сервером и прокси-сервер через него.
Вы должны проверить на listening
событие, как это, чтобы увидеть, действительно ли сервер слушает:
var http=require('http');
var server=http.createServer(function(req,res){
res.end('test');
});
server.on('listening',function(){
console.log('ok, server is running');
});
server.listen(80);
Что действительно помогло мне было:
killall -9 node
Но это убьет системный процесс.
С
ps ax
Вы можете проверить, сработало ли это.
Вышеупомянутое killall -9 node
, предложенный Патриком, работает как положено и решает проблему, но вы можете прочитать часть этого ответа, посвященную редактированию. kill -9
может быть не лучший способ сделать это.
Кроме того, вы можете захотеть нацелиться на один процесс, а не на вслепую убивать все активные процессы.
В этом случае сначала получите идентификатор процесса (PID) процесса, запущенного на этом порту (скажем, 8888):
lsof -i tcp:8888
Это вернет что-то вроде:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 57385 You 11u IPv6 0xac745b2749fd2be3 0t0 TCP *:ddi-tcp-1 (LISTEN)
Тогда просто сделайте (ps - на самом деле нет. Пожалуйста, продолжайте читать ниже):
kill -9 57385
Вы можете прочитать немного больше об этом здесь.
РЕДАКТИРОВАТЬ: я читал на довольно смежную тему сегодня и наткнулся на эту интересную ветку о том, почему я не должен kill -9
процесс.
Как правило, вы должны использовать kill -15 перед kill -9, чтобы дать целевому процессу шанс убраться за собой. (Процессы не могут перехватить или игнорировать SIGKILL, но они могут и часто перехватывают SIGTERM.) Если вы не дадите процессу возможность завершить то, что он делает, и очистить, он может оставить поврежденные файлы (или другое состояние) вокруг что он не сможет понять после перезапуска.
Итак, как уже говорилось, вам лучше убить описанный выше процесс с помощью:
kill -15 57385
РЕДАКТИРОВАТЬ 2: Как отмечалось в комментарии здесь много раз, эта ошибка является следствием не изящного выхода из процесса. Это означает, что многие люди выходят из команды узла (или любой другой), используя CTRL + Z. Правильный способ остановить запущенный процесс - выполнить команду CTRL+C, которая выполняет чистый выход.
Правильный выход из процесса освободит этот порт при выключении. Это позволит вам перезапустить процесс без необходимости убивать его самостоятельно, прежде чем вы сможете снова запустить его.
** ПЕРЕД СКАЧИВАНИЕМ - Пожалуйста, ПРОЧИТАЙТЕ ответ. ЭТО СООТВЕТСТВУЕТ! Если вы собираетесь понизить это, оставьте комментарий, почему вы считаете, что это не актуально.
Просто голова в голову, Skype иногда прослушивает порт 80 и, следовательно, вызывает эту ошибку, если вы пытаетесь прослушивать порт 80 из Node.js или любого другого приложения.
Вы можете отключить это поведение в Skype, открыв опции и нажав "Дополнительно" -> "Подключение" -> "Использовать порт 80" (снимите этот флажок)
Вы должны попытаться убить процесс, который прослушивает порт 80.
Killall убьет все работающие приложения узла. Возможно, вы не захотите этого делать. С помощью этой команды вы можете убить только одно приложение, которое прослушивает известный порт.
Если вы используете unix, попробуйте эту команду:
sudo fuser -k 80/tcp
Причина ошибки: вы пытаетесь использовать занят
port number
Есть два варианта решения этой проблемы в Windows/Mac
- Свободный в настоящее время используемый номер порта
- Выберите другой номер порта для вашей текущей программы
1. Номер свободного порта
Windows
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
макинтош
Вы можете попробовать netstat
netstat -vanp tcp | grep 3000
Для OSX El Capitan и новее (или если ваш netstat не поддерживает -p), используйте lsof
sudo lsof -i tcp:3000
если это не решит вашу проблему, Mac
пользователи могут обратиться к полному обсуждению этой проблемы. Найти (и убить) процесс блокировки порта 3000 на Mac
2. Изменить номер порта?
Windows
set PORT=5000
макинтош
export PORT=5000
lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID
kill PID
ex: kill 129393
Это работает для меня (я использую Mac). Запустите эту команду
lsof -PiTCP -sTCP:LISTEN
Это покажет список портов, которые использует ваша система. Найти PID
что ваш узел работает
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 17269 hientrq 16u IPv6 0xc42959c6fa30c3b9 0t0 TCP *:51524 (LISTEN)
node 17269 hientrq 19u IPv4 0xc42959c71ae86fc1 0t0 TCP localhost:1337 (LISTEN)
и беги kill -9 [YOUR_PID]
Ваше приложение уже запущено на этом порту 8080 . Используйте этот код, чтобы убить порт и снова запустить ваш код
sudo lsof -t -i tcp:8080 | xargs kill -9
Еще одна вещь, которая может выдать эту ошибку, это два HTTP-сервера в одном коде узла. Я обновлял код Express 2 до Express 3, и у меня было это...
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
// tons of shit.
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
И это вызвало эту ошибку.
EADDRINUSE
означает, что порт (который мы пытаемся прослушать в приложении узла) уже используется. Чтобы преодолеть это, нам нужно определить, какой процесс выполняется с этим портом.
Например, если мы пытаемся прослушать приложение нашего узла в порту 3000. Нам нужно проверить, используется ли этот порт каким-либо другим процессом.
шаг 1:
$sudo netstat -plunt |grep :3000
Что приведенная выше команда дает ниже результат.
tcp6 0 0 :::3000 :::* LISTEN 25315/node
шаг 2:
Теперь у вас есть идентификатор процесса (25315). Убейте этот процесс.
kill -9 25315
шаг 3:
npm run start
Примечание: это решение для пользователей Linux.
sudo kill $(sudo lsof -t -i:80)
для насильственного убийства
sudo kill -9 $(sudo lsof -t -i:80)
используйте выше cmd, чтобы убить определенный порт и затем запустить свой сервер
Попробуйте обе команды, и это остановит весь процесс узла.
killall 9 node
pkill node
npm start
Есть способ завершить процесс с помощью диспетчера задач:
Обратите внимание, что это решение только для Windows
Заходим в Диспетчер задач (или с помощью ярлыка Ctrl+ Shift+ Esc)
В "Фоновых процессах" найдите процессы "Node.js" и завершите их (щелкните их правой кнопкой мыши и выберите "Завершить задачу").
- Теперь ты сможешь начать снова
В приведенной ниже команде замените ваш номер порта
sudo lsof -t -i tcp:portNumber | xargs kill -9
Я получил:
Error: listen EADDRINUSE: address already in use :::8000
Я пытался найти процесс, который слушает порт 8000,
и мне не повезло - их не было (sudo netstat -nlp | grep 8000
).
Оказалось, у меня было app.listen(8000)
написано дважды в моем сценарии.
Мое предположение состоит в том, что вмешательство происходило только в течение короткого времени при попытке запустить сценарий, поэтому поиск процессов, прослушивающих порт до и после ошибки, не показал никаких.
Эта ошибка возникает, когда у вас запущен какой-либо процесс на порту, на котором вы хотите запустить свое приложение.
как узнать, какой процесс выполняется на этом порту => команда: sudo netstat -ap | grep:3000
вывод: вы получите информацию о процессе, который использует этот порт
tcp 0 0 IP-адрес: 3000 : СЛУШАТЬ 26869/ узел
Теперь вы можете убить этот процесс sudo kill -9 26869
EADDRINUSE означает, что порт вашего приложения nodejs уже используется.
- Теперь вы должны убить процесс / приложение, работающее на этом порту.
- Найдите идентификатор процесса приложения по:
lsof -i tcp: 3000
- Теперь вы получите идентификатор процесса из этого.
- Запустите это:
убить -9 processId
У меня тоже такая же проблема, и я просто закрываю терминал, открываю новый терминал и запускаю
node server.js
снова. это работает для меня, некоторое время просто нужно подождать несколько секунд, пока он снова не заработает.
Но это работает только на компьютере разработчика, а не на консоли сервера.
Ошибка: прослушивание EADDRINUSE означает, что порт, который вы хотите назначить / привязать к вашему серверу приложений, уже используется. Вы можете назначить другой порт вашему приложению.
Или, если вы хотите назначить тот же порт для приложения. Затем убейте приложение, запущенное на желаемом порту.
Для приложения узла, вы можете попробовать найти идентификатор процесса для приложения узла:
ps -aux | grep node
После получения идентификатора процесса выполните
kill process_id
Ошибка EADDRINUSE
(Адрес уже используется) сообщает, что в локальной системе уже есть другой процесс, занимающий этот адрес / порт.
Существует пакет npm, называемый find-process, который помогает найти (и закрыть) занимающий процесс.
Вот небольшой демонстрационный код:
const find = require('find-process')
const PORT = 80
find('port', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})
Я подготовил небольшой образец, который может воспроизвести EADDRINUSE
ошибка. Если вы запустите следующую программу в двух отдельных терминалах, вы увидите, что первый терминал запустит сервер (на порту "3000"), а второй терминал закроет уже работающий сервер (поскольку он блокирует выполнение второго терминала, EADDRINUSE
):
Минимальный рабочий пример:
const find = require('find-process')
const http = require('http')
const PORT = 3000
// Handling exceptions
process.on('uncaughtException', (error) => {
if (error.code === 'EADDRINUSE') {
find('port', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log('Shutting down blocking application...')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})
// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'})
response.write('Hello World!')
response.end()
})
server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))
В моем случае Apache HTTP Server был запущен на порту 80, я решил это с помощью команды root
sudo killall httpd
Обновить
Если Jenkin установлен и работает на вашем Mac;
- Вы можете проверить это с
sudo lsof -i tcp:8080
- Если да, и вы хотите остановить Дженкинса только один раз, запустите:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
Я видел эту ошибку раньше (в узле) с http.client, и, насколько я помню, проблема была связана с не инициализацией httpClient или установкой неверных параметров при создании httpClient и / или в запросе url.
Два сервера не могут прослушивать один и тот же порт, поэтому проверьте, прослушивает ли другой сервер тот же порт, а также проверьте синхронизацию браузера, если он работает на том же порту.
Кажется, что запущен еще один Node ng обслуживающий процесс. Проверьте это, набрав это в своей консоли (Linux/Mac):
ps aux|grep node
и выйдите из него:
kill -9 <NodeProcessId>
ИЛИ альтернативного использования
ng serve --port <AnotherFreePortNumber>
обслуживать ваш проект на свободном порту по вашему выбору.
Для других людей на Windows 10 с узлом как localhost
и работает на порту, как 3500, а не 80 ...
Что не работает:
killall ? command not found
ps -aux | grep 'node' ? ps: user x unknown
Что показывает информацию, но все еще не работает:
ps -aef | grep 'node'
ps ax
kill -9 61864
Что работает:
Git Bash или Powershell для Windows
net -a -o | grep 3500 (whatever port you are looking for)
Обратите внимание на PID (справа)
Я не мог получить killall
работать... так
- Откройте диспетчер задач
- На вкладке процессов щелкните правой кнопкой мыши Имя или любой столбец и выберите включение PID.
- Сортировка по PID, затем щелкните правой кнопкой мыши по правому PID и нажмите "Завершить задачу".
Теперь, после этого не очень веселого упражнения для Windows, я понял, что могу использовать диспетчер задач, найти движок Node и просто завершить его.
К вашему сведению, я использовал код Visual Studio для запуска Node через порт 3500, и я использую оболочку Git Bash внутри кода VS. Я грациозно завершил работу с помощью Ctrl + C, но иногда это не убивает его. Я не хочу менять свой порт или перезагружаться, чтобы это работало. Надеюсь, это поможет другим. В противном случае это документация для меня.
У меня недавно была такая же проблема.
Это означает, что порт уже используется другим приложением (экспресс или другое программное обеспечение)
В моем случае я случайно запустил экспресс на 2 терминалах, поэтому выход из терминала с помощью Ctrl + C исправил все для меня. (Запустить сервер только с одного терминала)
Надеюсь, что это помогает другим.
Для пользователей Windows выполните следующую команду в окне PowerShell, чтобы завершить все процессы узла.
Stop-Process -processname node
В Debian я обнаружил, что для запуска на 80-м порту необходимо выполнить команду от имени root, т.е.
sudo node app.js
Я надеюсь, что это помогает