ExpressJS - киньте Er Unhandled подія помилки


180

Я створив програму expressjs за допомогою наступних команд:

express -e folderName
npm install ejs --save
npm install

Коли я запускаю програму з:, у node app.jsмене є такі помилки:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: listen EADDRINUSE
    at errnoException (net.js:884:11)
    at Server._listen2 (net.js:1022:14)
    at listen (net.js:1044:10)
    at Server.listen (net.js:1110:5)
    at Object.<anonymous> (folderName/app.js:33:24)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Як це виправити?


30
EADDRINUSE означає, що порт вже використовується. спробуйте змінити, який порт веб-сервер у app.js слухає або вбийте все, що зараз використовується цим портом, якщо він вам не потрібен.
go-oleg

Якщо закриття порту не фіксуючи, спробуйте це> stackoverflow.com/a/52441297/6665568
Natesh Бхат

Відповіді:


400

Ви запустили інший сервер, використовуючи той самий порт, як 8080.

Можливо, ви бігли node appв іншій оболонці. Закрийте її та запустіть ще раз.

Ви можете перевірити ПОРТ №. доступний або не використовується

netstat -tulnp | grep <port no>

Крім того, ви можете використовувати lsof :

lsof -i :<port no>

4
Я наткнувся на це за допомогою WebStorm. У мене було відкрито два сеанси налагодження в одній робочій області. До!
Нік Куран

53
Така поширена помилка справді заслуговує кращого повідомлення про помилку.
Тамлін

Це сталося зі мною при використанні node-activedirectory. У моєму baseDN відсутній субдомен. baseDN: 'ldap: // dc = піддомен, dc = домен, dc = com'
Марк

Запускається екземпляр rails server...: |
Шехаряр

1
на mac high sierra: lsof -nP -i4TCP: $ PORT | grep LISTEN
Roee

61

Ми отримуємо подібну помилку, коли інколи запускаємо наш експрес-додаток. У цьому випадку ми повинні слідувати тому ж. Нам потрібно перевірити, чи працює його в якомусь терміналі. Якщо ви хочете знайти і вбити процес, виконайте наступні дії:

  • ps aux | греп-вузол
  • Знайдіть ідентифікатор процесу (другий зліва):
  • вбити -9 PRCOCESS_ID

АБО

Використовуйте одну команду, щоб закрити всі запущені процеси у вузлі.

ps aux | awk '/node/{print $2}' | xargs kill -9

5
ps aux | grep node | awk '{print $2}' | xargs kill -9
Даніель

killall -r node(in linux)
jt3k

25

Екземпляр, ймовірно, ще працює. Це виправить.

killall node

Оновлення: Ця команда працюватиме лише в Linux / Ubuntu & Mac.


1
вузол killall -9
Pankaj Shinde

16

Якщо ви працюєте в Linux, ця проблема також може виникнути, якщо Nodejs не працює як root.

Змінити з цього:

nodejs /path/to/script.js

До цього:

sudo nodejs /path/to/script.js

Щойно зі мною трапилося, і жодна з інших пропозицій тут не виправила. На щастя, я згадав, що сценарій працював днями, коли він працював як root. Сподіваюся, це допоможе комусь!

Відмова: Це, мабуть, не найкраще рішення для виробничого середовища. Запуск вашої служби як root може ввести деякі отвори в безпеці для вашого сервера / програми. У моєму випадку це було рішення для місцевої служби, але я б закликав інших витратити трохи більше часу, намагаючись вирішити причину.


1
Дуже небезпечно просто запустити скрипт як root, щоб вирішити цю проблему. Якщо ви не намагаєтеся прив’язатись до порту під 1024, вам ніколи не потрібно запускати вузол як root. Я підозрюю, що у вашому випадку ви намагаєтеся прив’язатись до порту 80 або 443. Я б запропонував використовувати Nginx для спрямування трафіку з цих портів у nodejs на більш високому порту, наприклад 8000 або щось подібне.
варікін

1
Дякуємо, що вказали на це. Я не думаю, що конкретний сценарій, який я використовував, викликав для будь-якого з цих портів, я, звичайно, не використовую Node як http-сервер. Можливо, саме один із модулів, які я використовував, вимагав отримати додаткові дозволи? Прошу вибачення, що минув певний час, тому я навіть не впевнений, який сценарій вимагає цього рішення. Я додам заперечення щодо спроб цього у виробничих умовах.
CauselessEffect

12

Це тому, що порт, який ви використовуєте для запуску сценарію, вже використовується. Ви повинні зупинити всі інші вузли, які використовують цю посаду. для цього ви можете перевірити всі вузли

ps -e

АБО для використання лише у вузлі. ps -ef | grep node Це дасть вам список усіх процесів вузла з id

щоб вбити весь процес вузла

sudo killall -9 node

Або для конкретного ідентифікатора sudo kill -9 id


ти врятував мою НОЧУ!
Муджтаба Махмуд

8

Я виправив помилку, змінивши порт, який був

app.set('port', process.env.PORT || 3000);<br>

і змінено на:

app.set('port', process.env.PORT || 8080);<br>

1
Чим це відрізняється від застосування того, що говорить прийнята відповідь до відповіді, даної Марком?
EWit

3

Вузол порту, який намагається використовувати, вже може бути використаний іншою програмою. У моєму випадку це був ntop , який я нещодавно встановив. Мені довелося відкрити http: // localhost: 3000 / у браузері, щоб зрозуміти це. Ще один спосіб знайти цей процес наведено тут .


2

Якщо ви хочете використовувати той самий номер порту, тоді введіть kill %термінал, який вбиває поточний фоновий процес і звільняє порт для подальшого використання.



1

Закрийте будь-які інші сервери вузлів, які працюють, навіть якщо вони знаходяться в інших вікнах терміналів або працюють на різних портах. Це має вирішити проблему.


1

Якщо ви намагалися вбити всі екземпляри вузла та інші служби, які слухають 3000 (за замовчуванням, які використовуються експрес-налаштуванням скелета), безрезультатно, вам слід перевірити, чи ваше середовище не визначає "порт", щоб стати чимось несподіваним. В іншому випадку ви, ймовірно, отримаєте ту ж помилку. У файлі app.js експресного скелета ви помітите рядок 15:

app.set('port', process.env.PORT || 3000);

1

Щоб виправити це, скасуйте або закрийте сервер, на якому ви працюєте. Якщо ви використовуєте Eclipse IDE, виконайте це,

Виконати> Налагодження

введіть тут опис зображення

Клацніть правою кнопкою миші запущений процес і натисніть кнопку Завершити .


1

events.js: 183 кинути ер; // Неопрацьована подія "помилки"

Я також мав таку ж проблему і спробував багато способів, але, нарешті, отримав це, це добре працює:

npm install ws@3.3.2 --save-dev --save-exact

Перейдіть за цим посиланням для отримання додаткових роз'яснень https://github.com/ionic-team/ionic-cli/isissue/2922


1

Насправді клавіші Ctrl + C не вивільняють порт, який використовується вузловим процесом. Отже, є ця помилка. Для вирішення проблеми було використано наступний фрагмент коду в server.js:

process.on('SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit(1);
});

Це працювало для мене.

Ви також можете перевірити інші рішення, згадані при вимкненому відключенні в NodeJS


1

Причина цієї помилки

Інший процес вже працює на вказаному вами порту

Просте і швидке рішення

У ОС Linux, наприклад, ви вказали 3000 як порт

  • Відкрийте термінал і запустіть lsof -i :3000. Якщо якийсь процес вже працює на порту 3000, ви побачите цю друк на консолі

COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    16615 aegon   13u  IPv6 183768      0t0  TCP *:3000 (LISTEN)

  • Скопіюйте PID (ідентифікатор процесу) з виводу

  • Запустити sudo kill -9 16615(PID потрібно поставити після -9)

  • Запустіть сервер ще раз

0

У моєму випадку мені також довелося бігати vagrant reload. Навіть не маючи вузлових процесів, які запускають експрес-додаток у моїй віртуальній машині, я все ще отримував цю помилку, поки не завантажував бродячий ящик.


0

Зупиніть службу, яка використовує цей порт.

sudo service NAMEOFSERVICE stop

0

У моєму випадку проблема була викликана забуванням викликати виклик next()методу expressjs `use '.

Якщо поточне проміжне програмне забезпечення не закінчило цикл відповіді на запит, воно повинно викликати next (), щоб передати управління наступному середньому програмному забезпеченню, інакше запит буде залишений висить.

http://expressjs.com/guide/using-middleware.html




0

Після того, як кілька разів вбив один і той же процес і не зміг знайти те, що ще працює на порту 8000, я зрозумів, що намагаюся запустити порт 8000 двічі:

Перед:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});
app.listen(port, () => {
  console.log("We are live on " + port);
});

Після:

MongoClient.connect(db.url, (err, database) => {
  if (err) return console.log(err);
  require('./app/routes')(app, database);

  app.listen(port, () => {
    console.log('We are live on ' + port);
  });
});

require('./app/routes')(app, {});

0

У мене була така ж проблема, і я з'ясував, що процес nodejs, який я раніше скасував із CTRL + C, все ще працює. Проблема в Windows 10 полягає в тому, що Ctrl + C не вбиває вишукано nodejs. Я відкрив менеджер завдань і вбив процес вручну. Рішення, надані на GitHub, не працювали для мене.


0

Якщо ви використовуєте Windows, ви можете закінчити процес у менеджера завдань для node.js


0

Жодна з відповідей не працювала для мене.

Коли я перезапустив комп’ютер, я міг запустити і запустити сервер.

Мак
shutdown now -r

Linux
sudo shutdown now -r


0

-> перевірити, що працює на порту 8080 або що коли-небудь порт, який ви хочете перевірити

lsof -i @localhost:8080

якщо щось запущено u, можна закрити його або використовувати якусь команду kill, щоб закрити його


0

Просто перевірте свій темінал у коді Visual Studio. Тому що я працював у своєму додатку для вузла, і я перезимував ноутбук, а потім наступного ранку повертаю ноутбук до розробки програмного забезпечення. Тоді я знову запускаю команду nodemon app.js Перший запускався з ночі, а другий виконував мою останню команду, тому два командні підказки прослуховують ті самі порти, тому ви отримуєте цю проблему. Простий Закрийте один termianl або весь термінал, а потім запустіть свій вузол app.js або nodemon app.js


0

Порт, який ви слухаєте, вже слухається іншим процесом.

Коли я зіткнувся з цією помилкою, я вбив процес за допомогою Windows PowerShell (тому що я використовував Windows)

  1. Перелічіть її, щоб відкрити панель захисту вікон
  2. введіть psі тоді ви можете отримати список процесів
  3. знайдіть процес, названий вузлом , і відзначте Id
  4. типу Stop-process <Id> Я думаю, що це допомога для користувачів Windows

0

Я зіткнувся з тим же питанням сьогодні, і порт не використовувався. Наступний підхід допоміг:

rm -rf node_modules && npm cache clean && npm install
npm start

0

Якщо це в mac, то все стосується IP x86_64-apple-darwin13.4.0. Якщо ви дотримуєтесь помилок, це було б щось пов'язане з x86_64-apple-darwin13.4.0. Додайте

127.0.0.1 x86_64-apple-darwin13.4.0

до файлу / etc / hosts Тоді проблеми вже немає


-1

Просто змініть свій порт, можливо, ваш поточний порт використовується iis або іншим сервером.


На це запитали і відповіли 4 роки тому з тією ж, але кращою відповіддю.
Джордж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.