Если я запускаю сервер с портом 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();
Ответ 1
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);
Ответ 2
Что действительно помогло мне:
killall -9 node
Но это убьет системный процесс.
С
ps ax
вы можете проверить, не сработало ли оно.
Ответ 3
Вышеупомянутый 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: как отмеченный в комментарии здесь, эта ошибка является следствием не изящного выхода из процесса. Это означает, что многие люди выходят из команды node (или любой другой), используя CTRL + Z. Правильный способ остановки запущенного процесса - выдать команду CTRL + C, которая выполняет чистый выход.
Выход из процесса правильным способом освободит этот порт при выключении. Это позволит вам перезапустить процесс, не переживая проблемы с его убийством, прежде чем сможет снова запустить его.
Ответ 4
Просто на голову, Skype иногда прослушивает порт 80 и, следовательно, вызывает эту ошибку, если вы пытаетесь прослушать порт 80 из Node.js или любого другого приложения.
Вы можете отключить это поведение в Skype, открыв опции и щелкнув Дополнительно → Соединение → Использовать порт 80 (снимите этот флажок)
![Turn off Skype port 80 usage]()
PS После внесения этого изменения не забудьте перезапустить Skype!
Ответ 5
Вы должны попытаться убить процесс, который прослушивает порт 80.
Killall убьет все запущенные приложения node. Возможно, вы не захотите этого делать. С помощью этой команды вы можете убить только одно приложение, которое прослушивает известный порт.
Если вы используете unix, попробуйте эту команду:
sudo fuser -k 80/tcp
Ответ 6
Под контроллером env вы можете использовать:
pkill node
перед запуском вашего скрипта должен выполнить эту работу.
Имейте в виду, что эта команда уничтожит все процессы node
, что может быть правильным, если у вас есть, например, контейнер, выполняющий только один экземпляр, а у вас есть такой env, где вы можете это гарантировать.
В любом другом случае я рекомендую использовать команду для уничтожения определенного идентификатора процесса или имени, которое вы нашли, ища его программно. Например, если ваш процесс называется node-server-1, вы можете выполнить pkill node-server-1
.
Этот ресурс может быть полезен для понимания: https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/
Ответ 7
Причина ошибки: вы пытаетесь использовать номер занятого port number
Есть два возможных решения этой проблемы на Windows/Mac
- Свободный в настоящее время используемый номер порта
- Выберите другой номер порта для вашей текущей программы
1. Номер свободного порта
Windows
1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
![enter image description here]()
макинтош
Вы можете попробовать 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
Ответ 8
Приложение уже запущено на этом порту 8080. Используйте этот код, чтобы убить порт и снова запустить код.
sudo lsof -t -i tcp:8080 | xargs kill -9
Ответ 9
Еще одна вещь, которая может дать эту ошибку, - это два HTTP-сервера в одном и том же коде node. Я обновлял код 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'));
});
И это вызвало эту ошибку.
Ответ 10
Это работает для меня (я использую mac). Запустить эту команду
lsof -PiTCP -sTCP:LISTEN
Это приведет к отображению списка портов, которые использует ваш syetem. Найдите 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]
Ответ 11
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.
Ответ 12
sudo kill $ (sudo lsof -t -i: 80)
за силу убить
sudo kill -9 $ (sudo lsof -t -i: 80)
используйте выше cmd, чтобы убить определенный порт, а затем запустите свой сервер
Ответ 13
Попробуйте обе команды, и это остановит весь процесс узла.
killall 9 node
pkill node
npm start
Ответ 14
Эта ошибка возникает, когда у вас есть какой-либо процесс, выполняющийся на порту, на котором вы хотите запустить приложение.
как получить, какой процесс работает на этом порту = > команда:
sudo netstat -ap | grep: 3000
: вы получите информацию о процессе, которая использует этот порт
tcp 0 0 IPaddress: 3000: LISTEN 26869/node
Теперь вы можете убить этот процесс
sudo kill -9 26869
Ответ 15
EADDRINUSE означает, что порт вашего приложения nodejs уже используется.
- Теперь вы должны убить процесс/приложение, работающее на этом порту.
- Найдите идентификатор процесса приложения по:
lsof -i tcp: 3000
- Теперь вы получите идентификатор процесса из этого.
- Запустите это:
убить -9 processId
Ответ 16
Я видел эту ошибку до (в node) с http.client, и, как я помню, проблема связана с не инициализацией httpClient или установкой неправильных параметров в создании httpClient и/или в запросе url.
Ответ 17
У меня тоже проблема, и я просто закрываю терминал и открываю новый терминал и запускаю
node server.js
снова. это работает для меня, некоторое время просто нужно подождать несколько секунд, пока он не заработает снова.
Но это работает только на машине разработчика, а не на консоли сервера.
Ответ 18
Ошибка: прослушать EADDRINUSE означает, что порт, который вы хотите назначить/привязать к серверу приложений, уже используется. Вы можете назначить другой порт для своего приложения.
Или если вы хотите назначить один и тот же порт для приложения. Затем запустите приложение, которое выполняется на нужном порту.
Для приложения node, что вы можете попробовать, найдите идентификатор процесса для приложения node:
ps -aux | grep node
После получения идентификатора процесса сделайте
kill process_id
Ответ 19
В приведенной ниже команде замените номер порта
sudo lsof -t -i tcp:portNumber | xargs kill -9
Ответ 20
В Debian я обнаружил, что для запуска на порту 80 вам необходимо выдать команду с именем root i.e
sudo node app.js
Я надеюсь, что это поможет
Ответ 21
В моем случае HTTP-сервер Apache был запущен на порту 80, я решил его, выпустив команду как root
sudo killall httpd
Обновить
Если Jenkin установлен и запущен на вашем Mac;
- Вы можете проверить его с помощью
sudo lsof -i tcp:8080
- Если да, и вы хотите остановить Дженкинса только один раз, запустите:
sudo launchctl unload/Library/LaunchDaemons/org.jenkins-ci.plist
Ответ 22
Похоже, что работает другой процесс обслуживания Node ng. Проверьте это, набрав это в консоли (Linux/Mac):
ps aux|grep node
и прекратите его с:
kill -9 <NodeProcessId>
ИЛИ альтернативное использование
ng serve --port <AnotherFreePortNumber>
чтобы служить вашему проекту в свободном порту по вашему выбору.
Ответ 23
При уничтожении NODE_PORT он может убить ваш хромовый процесс или что-нибудь, что слушает один и тот же порт, и это раздражает.
Эта оболочка script может быть полезна - в моем случае порт 1337, но вы можете изменить его в любое время
# LOGIC
CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`
for pid in $PORT_PIDS
do
if [[ ${CHROME_PIDS} != *$pid* ]];then
# NOT FOUND IN CHROME PIDS
echo "Killing $pid..."
ps -p "$pid"
kill -kill "$pid"
fi
done
sails lift
# OR 'node app' OR whatever that starts your node
exit
Ответ 24
В моем случае я использую веб-хостинг, но он тот же на локальном хосте, я использовал:
ps -aef | grep 'node'
для просмотра процесса node, консоль показывает процесс с помощью PID.
для уничтожения процесса вы должны использовать эту команду:
kill -9 PID
где PID - это идентификатор процесса из приведенной выше команды.
Ответ 25
Два сервера не могут прослушивать один и тот же порт, поэтому проверьте, не прослушивается ли другой сервер на том же порту, также проверьте синхронизацию браузера, если он работает на одном и том же порту
Ответ 26
Для других людей в Windows 10 с node как 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 и нажмите кнопку завершения.
Теперь, после этого не очень забавное упражнение на окнах, я понял, что могу использовать диспетчер задач и найти движок node и просто закончить его.
FYI, я использовал код Visual Studio для запуска node на порт 3500, и я использую оболочку Git Bash внутри кода VS. Я вышел изящно с помощью Ctrl + C, но иногда это не убивает его. Я не хочу менять порт или перезагружать, так что это сработало. Надеюсь, это помогает другим. В противном случае это документация для меня.
Ответ 27
Вариант, который работает для меня:
Бег:
ps -ax | grep node
Вы получите что-то вроде:
8078 pts/7 Tl 0:01 node server.js
8489 pts/10 S+ 0:00 grep --color=auto node
kill -9 8078
Ответ 28
Ошибка 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}"...'))
Ответ 29
Я бы предпочел сделать
killall -15 node
потому что, kill -15
дает возможность kill -15
себя. Теперь вы можете проверить
ps aux | grep node
Примечание. Если вы не даете процессу возможность завершить то, что он сейчас делает, и очистить, это может привести к повреждению файлов
Ответ 30
Недавно у меня была такая же проблема.
Это означает, что порт уже используется другим приложением (явным или другим программным обеспечением)
В моем случае я случайно запустил экспресс на 2 терминалах, поэтому выйдите из терминала, используя для меня фиксированные вещи "Ctrl + C". (Запустите сервер только с одного терминала)
Надеюсь, это поможет другим.