Как исправить ошибку: слушать 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 ответов
Вариант, который работает для меня:
Бежать:
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
ИСПРАВЛЕНИЕ ОШИБКИ NOOB: Я новичок в Node.js и настроил веб-сервер, прослушивающий порт 8080. Я столкнулся с ошибкой EADDRINUSE. Я пробовал все различные итерации «kill -9 node» и продолжал получать «node: no process found»
Проблема была в том, что я звонил по http.listen(8080); ДВАЖДЫ в одном куске кода. Итак, в первый раз он действительно работал нормально, а во второй раз он выдал ошибку.
Если вы получаете ответ «процесс не найден» при попытке убить порт, попробуйте убедиться, что вы открываете порт только один раз.
Я бы предпочел сделать
killall -15 node
так как, kill -15
дает процессу возможность очистить себя. Теперь вы можете проверить по
ps aux | grep node
Примечание. Если вы не дадите процессу возможность завершить то, что он в данный момент делает, и очистить, это может привести к повреждению файлов.
Убивая NODE_PORT, он может убить ваш процесс chrome или все, что слушает тот же порт, и это раздражает.
Этот сценарий оболочки может быть полезен - в моем случае порт 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
Это случилось со мной, потому что мой сервер работал в другом окне терминала. Закрытие соединения решило проблему.
В моем случае я использую веб-хостинг, но на локальном хосте то же самое, я использовал:
ps -aef | grep 'node'
тогда для наблюдения за процессом узла консоль показывает процесс с PID. Для уничтожения процесса вы должны использовать эту команду:
kill -9 PID
где PID - это идентификатор процесса из приведенной выше команды.
Шаги для ее решения -:
1: нужно убить процесс следующей командой.
pm2 убить <PROCESS_ID>
2: снова перезапустите службу с помощью следующей команды:
pm2 start app.js --name "имя_сервера"
3: проверьте состояние сервера с помощью следующей команды.
список pm2
Эта ошибка возникла, когда у нас случайно были две локальные среды Express в одном экземпляре, указывающие на один и тот же порт.
Если вы дошли до этого списка ответов, я надеюсь, что это поможет вам решить вашу проблему.
В ZSH, когда я набирал
exit
, Я заметил сообщение:
zsh: you have suspended jobs
.
- Введите слово
jobs
, ударить - Тип
kill %1
(где% 1 - номер задания), нажмитеenter
- В ответе должно быть указано
terminated {job_name}
Я нашел ответ здесь
EADDRINUSE переводится как "Порт, на котором вы пытаетесь запустить app.listen(), используется другими программами". Вы можете использовать такой скрипт, чтобы проверить, используется ли ваш порт, а затем изменить порт в вашем app.listen().
var net = require('net');
var errors = ['EADDRINUSE'];
var isUsed = function(port) {
var tester = net.createServer()
.once('error', function (err) {
if (!errors.includes(err.code)) {
console.log("Port is in use, change the port.");
}
})
.once('listening', function() {
tester.once('close', function() {
console.log("You are good to go.");
})
.close()
})
.listen(port);
}
Вы можете добавить другие ошибки в массив ошибок, чтобы также проверить все типы ошибок.
Если вы используете образ докера с nodejs, просто остановите контейнер:
- чтобы получить nodejs CONTAINER_ID
docker ps
- и останови это
docker stop CONTAINER_ID
- или если вы используете docker compose
docker compose stop nodejs_service_name
На самом деле вы пытаетесь запустить порт, который на самом деле занят некоторыми другими службами (обычно другими веб-серверами, такими как apache, iis и т. д.).
Выясните, какая служба использует порт
Остановите его и перезапустите узел сервера
Или выберите другой порт, например 8080,5000...
Для окон
netstat -ano -p tcp |find "80"
для линукса
sudo lsof -i -P -n
Windows всегда сложно с открытым исходным кодом..
поменяй порт просто работает
node-inspector --web-port=8099
Если вы хотите решить это
$ node server events.js:141 throw er; // Необработанное событие 'error' ^
Ошибка: прослушайте EADDRINUSE:::3000 в Object.exports._errnoException (util.js:907:11) в export._exceptionWithHostPort (util.js:930:20) в Server._listen2 (net.js:1250:14) в прослушивать (net.js:1286:10) на сервере Server.listen (net.js:1382:5) на EventEmitter.listen (C:\sendbox\mean\node_modules\express\lib\application .js:617:24) в Объект. (C:\sendbox\mean\server.js:28:5) в Module._compile (module.js:409:26) в Object.Module._extensions..js (module.js:416:10) в Модуле. нагрузка (module.js:343:32)
измените номер порта на 8000
Также полезно посмотреть, какой процесс использует порт.
Для macOS из этой статьи я узнал, что AirPlay использует порт 5000, поэтому, даже если вы отключите его с помощью перечисленных здесь решений, он снова займет порт 5000. Выполните быстрый поиск в Google, чтобы узнать, какие распространенные приложения или процессы используют порт, вызывающий ошибку.