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

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);

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

killall -9 node

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

2 — это число цифр, до которого мы хотим округлить это число.

ps ax

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

Вышеупомянутое killall -9 node, предложенное Патриком, работает как положено и решает проблему, но вы можете прочитать часть этого ответа, посвященную редактированию, о том, почему kill -9 может быть не лучшим способом сделать это.

Кроме того, вы можете захотеть нацелить процесс single , а не слепо убивать все активные процессы.

В этом случае сначала получите идентификатор процесса (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

edit 2 в комментарии здесь много раз, эта ошибка является следствием не изящного выхода из процесса. Это означает, что многие люди выходят из команды узла (или любой другой), используя CTRL Z . Правильный способ остановить запущенный процесс — выполнить команду CTRL C , которая выполняет чистый выход. Правильный выход из процесса освободит этот порт при завершении работы. Это позволит вам перезапустить процесс, не беспокоясь о том, чтобы убить его самостоятельно, прежде чем сможете снова запустить его.

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

Вы можете отключить это поведение в Skype, открыв опции и щелкнув Дополнительно — & Gt ; Соединение — & Gt ; Использовать порт 80 (снимите этот флажок) PS После внесения этих изменений не забудьте перезапустить Skype!

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

Turn off Skype port 80 usage

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

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

Вы пытаетесь использовать «занят»

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

sudo fuser -k 80/tcp    

Причина ошибки: Свободный в настоящее время используемый номер порта port number

. Выберите другой порт. номер вашей текущей программы

  1. 1. Номер свободного порта
  2. Windows

Mac

Вы можете попробовать netstat

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

enter image description here

Mac { *} Вы можете попробовать netstat

Для OSX El Capitan и новее (или если ваш netstat не поддерживает -p), используйте lsof

netstat -vanp tcp | grep 3000

, если это не решит вашу проблему,

sudo lsof -i tcp:3000

пользователи могут обратиться к полному обсуждению об этой проблеме Mac Найти (и убить) порт блокировки процесса 3000 на Mac 2. Изменить номер порта?


Windows

В среде контроллера вы можете использовать:

set PORT=5000

Mac

export PORT=5000

перед запуском скрипта.

pkill node Имейте в виду, что эта команда уничтожит все

. В любом другом сценарии я рекомендую использовать команду для уничтожения определенного идентификатора процесса или имени, которое вы нашли, ища его программно. например, если ваш процесс называется, node-server-1, вы могли бы сделать node процессы, которые могут быть правильными, если у вас есть контейнер, работающий только с одним экземпляром, у нас есть такой env, где вы можете это гарантировать.

Этот ресурс может быть полезен для понимания: pkill node-server-1 Глядя на вывод

https://www.thegeekstuff.com/2009/12/4-ways-to-kill -a-process-kill-killall-pkill-xkill / Еще одна вещь, которая может вызвать эту ошибку, — два 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')); 
});                                                                   

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

Это работает для меня (я использую Mac). Запустите эту команду

sudo lsof -t -i tcp:8080 | xargs kill -9

Это покажет список портов, которые использует ваша система. Найдите

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]

EADDRINUSE означает, что порт (который мы пытаемся прослушать в приложении узла) уже используется. Чтобы преодолеть это, нам нужно определить, какой процесс выполняется с этим портом.

Например, если мы пытаемся прослушать приложение нашего узла в порту 3000. Нам нужно проверить, используется ли этот порт каким-либо другим процессом.

Step1: {* } Однако дополнительное преимущество, которое имеет ECMAScript, заключается в том, что вы можете расширить его с помощью метода

$sudo netstat -plunt |grep :3000

То, что приведенная выше команда дает результат ниже.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

Step2:

Теперь у вас есть идентификатор процесса (25315). Убейте этот процесс.

kill -9 25315

step3:

npm run start

Примечание. Это решение для пользователей Linux.

sudo kill $ (sudo lsof -t -i: 80)

для принудительного уничтожения

sudo kill -9 $ (sudo lsof -t -i: 80)

Вот пример, показывающий, как создать статическую переменную

Попробуйте обе команды, и это остановит весь процесс узла.

killall 9 node
pkill node
npm start 

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

как узнать, какой процесс работает на этом порту = & команда gt ;: sudo netstat -ap | grep: 3000

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

tcp 0 0 IP-адрес: 3000 : Вы не нашли ответ на свой вопрос? Просмотрите другие вопросы с тегом

Теперь вы можете убить этот процесс sudo kill -9 26869

EADDRINUSE означает порт вашего Приложение nodejs уже используется.

  • Теперь вы должны убить процесс / приложение, работающее на этом порту.
  • Найдите идентификатор процесса приложения по:

lsof -i tcp: 3000

  • Теперь вы получите идентификатор процесса из этого.
  • Запустите это:

kill -9 processId

У меня тоже такая же проблема, я просто закрываю терминал, открываю новый терминал и запускаю

node server.js

снова. это работает для меня, некоторое время просто нужно подождать несколько секунд, пока он снова не заработает.

, но это работает только на компьютере разработчика вместо консоль сервера ..

Ошибка: слушайте EADDRINUSE означает, что порт, который вы хотите назначить / привязать к вашему серверу приложений, уже используется. Вы можете назначить другой порт вашему приложению.

Или если вы хотите назначить тот же порт приложению. Затем убейте приложение, запущенное на желаемом порту.

Для приложения узла, вы можете попробовать найти идентификатор процесса для приложения узла:

ps -aux | grep node

После получения идентификатора процесса выполните

kill process_id

В приведенной ниже команде замените ваш номер_порта

sudo lsof -t -i tcp:portNumber | xargs kill -9

Я видел эту ошибку до (в узле) с http.client, и, насколько я помню, проблема заключалась в том, чтобы не инициализировать httpClient или задавать неверные параметры при создании httpClient и / или в запросе url.

В Debian я обнаружил, что для запуска на 80-м порту необходимо выполнить команду от имени пользователя root, т.е.

sudo node app.js

, надеюсь, это поможет

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

sudo killall httpd

ОБНОВЛЕНИЕ

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

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

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

ps aux|grep node

и выйдите из него с помощью:

kill -9 <NodeProcessId>

ИЛИ альтернативно используйте

ng serve --port <AnotherFreePortNumber>

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

Убивая 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 — это идентификатор процесса из приведенной выше команды.

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

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

Опция, которая работает для меня:

Run:

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

Ошибка 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}"...`))

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

killall -15 node

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

ps aux | grep node

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

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

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

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

Javascript — Как преобразовать строку через запятую в массив? — Переполнение стека