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

Ответ 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. Свободный в настоящее время используемый номер порта
  2. Выберите другой номер порта для вашей текущей программы


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;

  1. Вы можете проверить его с помощью sudo lsof -i tcp:8080
  2. Если да, и вы хотите остановить Дженкинса только один раз, запустите: 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". (Запустите сервер только с одного терминала)

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