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

  1. Введите слово jobs, ударить
  2. Тип kill %1 (где% 1 - номер задания), нажмите enter
  3. В ответе должно быть указано 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 и т. д.).

  1. Выясните, какая служба использует порт

  2. Остановите его и перезапустите узел сервера

Или выберите другой порт, например 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, чтобы узнать, какие распространенные приложения или процессы используют порт, вызывающий ошибку.

В моем случае перезагрузка Ubuntu была полезной.

Другие вопросы по тегам