Как исправить ошибку: слушать EADDRINUSE при использовании nodejs? - PullRequest
412 голосов
/ 28 марта 2012

Если я запускаю сервер с портом 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();

Ответы [ 37 ]

508 голосов
/ 19 апреля 2013

Что действительно помогло мне:

killall -9 node

Но это убьет системный процесс.

С помощью

ps ax

вы можете проверить, сработало ли оно.

391 голосов
/ 28 марта 2012

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);
253 голосов
/ 11 мая 2015

Вышеупомянутый 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 , которая выполняет чистый выход.

Правильный выход из процесса освободит этот порт при завершении работы. Это позволит вам перезапустить процесс, не беспокоясь о том, чтобы убить его самостоятельно, прежде чем сможете снова запустить его.

59 голосов
/ 31 июля 2012

Просто на голову, Skype иногда будет прослушивать порт 80 и поэтому вызывает эту ошибку, если вы пытаетесь прослушивать порт 80 из Node.js или любого другого приложения.

Вы можете отключить это поведение вSkype, открыв параметры и нажав «Дополнительно» -> «Подключение» -> «Использовать порт 80» (снимите этот флажок)

Turn off Skype port 80 usage

PS После внесения этих изменений не забудьте перезапуститьSkype!

35 голосов
/ 25 декабря 2014

Вы должны попытаться убить процесс, который прослушивает порт 80.

Killall убьет все работающие приложения узла. Вы можете не захотеть этого делать. С помощью этой команды вы можете убить только одно приложение, которое прослушивает известный порт.

Если используется unix, попробуйте эту команду:

sudo fuser -k 80/tcp    
21 голосов
/ 04 мая 2018

Причина ошибки: Вы пытаетесь использовать занятое port number

Существует два возможных решения этой проблемы в Windows / Mac

  1. Свободный в настоящее время используемый номер порта
  2. Выберите другой номер порта для текущей программы


1,Номер свободного порта

Windows

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

enter image description here

Mac

Вы можете попробовать 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

Mac

export PORT=5000
21 голосов
/ 30 июня 2015

В 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/

16 голосов
/ 27 декабря 2017

Ваше приложение уже запущено на этом порту 8080.Используйте этот код, чтобы убить порт и снова запустить ваш код

sudo lsof -t -i tcp:8080 | xargs kill -9
15 голосов
/ 15 апреля 2013

Еще одна вещь, которая может выдать эту ошибку, это два 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')); 
});                                                                   

И это вызвало эту ошибку.

14 голосов
/ 06 августа 2018

Это работает для меня (я использую 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]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...