Как исправить ошибку: слушать 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 ]

2 голосов
/ 29 марта 2018

В моем случае сервер Apache HTTP был запущен на порту 80. Я решил это, выполнив команду от имени root

sudo killall httpd

Обновление

Если Jenkin установлен и работает на вашем Mac;

  1. Вы можете проверить это с помощью sudo lsof -i tcp:8080
  2. Если да, и вы хотите остановить Jenkins только один раз, выполните: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
2 голосов
/ 20 июля 2018

Кажется, что запущен другой процесс Node ng. Проверьте это, набрав это в своей консоли (Linux / Mac):

ps aux|grep node

и выйдите из него:

kill -9 <NodeProcessId>

ИЛИ альтернативного использования

ng serve --port <AnotherFreePortNumber>

для обслуживания вашего проекта на свободном порту по вашему выбору.

1 голос
/ 15 июля 2017

Для других людей в 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 работать ... так что

  1. Откройте диспетчер задач
  2. На вкладке процессов щелкните правой кнопкой мыши Имя или любой столбец и выберите включение PID
  3. Сортировка по PID, затем щелкните правой кнопкой мыши на правом PID и щелкните по завершить задачу.

Теперь, после этого не очень веселого упражнения для окон, я понял, что могу использовать диспетчер задач, найти движок Node и просто завершить его.

К вашему сведению, я использовал код Visual Studio для запуска Node на порту 3500, и я использую оболочку Git Bash внутри кода VS. Я грациозно завершил работу с помощью Ctrl + C, но иногда это не убивает его. Я не хочу менять свой порт или перезагружаться, чтобы это работало. Надеюсь, это поможет другим. В противном случае это документация для меня.

1 голос
/ 26 октября 2016

Убивая 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
1 голос
/ 14 декабря 2016

В моем случае я использую веб-хостинг, но на локальном хосте то же самое, я использовал:

ps -aef | grep 'node' 

для просмотра процесса узла, затем консоль показывает процесс с PID. Для уничтожения процесса вы должны использовать эту команду:

kill -9 PID

где PID - это идентификатор процесса из вышеприведенной команды.

1 голос
/ 20 декабря 2016

Два сервера не могут прослушивать один и тот же порт, поэтому проверьте, прослушивает ли другой сервер тот же порт, а также проверьте синхронизацию браузера, если он работает на том же порту

1 голос
/ 09 июля 2018

У меня недавно была такая же проблема.

Это означает, что порт уже используется другим приложением (экспресс или другим программным обеспечением)

В моем случае, я случайно запустил экспресс на2 терминала, так что выход из терминала с помощью Ctrl + C исправил все для меня.(Запустите сервер только из одного терминала)

Надеюсь, это поможет другим.

1 голос
/ 12 июня 2018

Я бы предпочел сделать

killall -15 node

, потому что kill -15 дает процессу возможность очистить себя.Теперь вы можете проверить с помощью

ps aux | grep node

Примечание. Если вы не дадите процессу возможность завершить то, что он в данный момент делает, и очистить, это может привести к повреждению файлов

1 голос
/ 10 февраля 2019

Это случилось со мной, потому что мой сервер работал в другом окне терминала. Закрытие соединения решило проблему.

1 голос
/ 05 февраля 2018

Ошибка 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}"...`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...