ExpressJS - выбросить событие необработанной ошибки

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)

Как это исправить?

JR Galia
источник
30
EADDRINUSE означает, что порт уже используется. попробуйте изменить порт, который слушает веб-сервер в app.js, или уничтожьте все, что в данный момент использует этот порт, если вам это не нужно.
go-oleg
Если закрытие порта не является исправлением, попробуйте это> stackoverflow.com/a/52441297/6665568
Natesh bhat

Ответы:

400

Вы запустили другой сервер, используя тот же порт, что и 8080.

Возможно, вы запустили node appдругую оболочку. Пожалуйста, закройте ее и запустите снова.

Вы можете проверить номер порта. доступно или не используется

netstat -tulnp | grep <port no>

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

lsof -i :<port no>
Glowin
источник
4
Я столкнулся с этим с помощью WebStorm. У меня было два сеанса отладки, открытых в одной рабочей области. Doh!
Ник Керран
53
Такая распространенная ошибка действительно заслуживает лучшего сообщения об ошибке.
Тамлин
Это случилось со мной при использовании node-activedirectory. В моем baseDN отсутствовал поддомен. окнеРазличающееся_имя_базыполь: 'LDAP: // DC = подобласть, dc = домен, DC = ком'
Mark
Был запущен экземпляр rails server...: |
Шехарьяр
1
на mac high sierra: lsof -nP -i4TCP: $ PORT | grep LISTEN
Роу,
61

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

  • PS Aux | grep узел
  • Найдите идентификатор процесса (второй слева):
  • убить -9 PRCOCESS_ID

ИЛИ

Используйте одну команду, чтобы закрыть все запущенные процессы узла.

ps aux | awk '/node/{print $2}' | xargs kill -9
monical
источник
5
ps aux | grep node | awk '{print $2}' | xargs kill -9
Даниэль
killall -r node(в linux)
jt3k
25

Экземпляр, вероятно, все еще работает. Это исправит это.

killall node

Обновление: эта команда будет работать только на Linux / Ubuntu и Mac.

TawabG
источник
1
узел killall -9
Панкадж Шинде
16

Если вы работаете в Linux, эта проблема также может возникнуть, если Nodejs не запущен от имени пользователя root.

Изменить от этого:

nodejs /path/to/script.js

К этому:

sudo nodejs /path/to/script.js

Просто случилось со мной, и ни одно из других предложений здесь не исправило это. К счастью, я вспомнил, что скрипт работал на днях при запуске от имени пользователя root. Надеюсь, это поможет кому-то!

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

CauselessEffect
источник
1
Звучит очень опасно, чтобы просто запустить скрипт от имени root, чтобы решить эту проблему. Если вы не пытаетесь привязать порт менее 1024, вам никогда не нужно запускать узел от имени root. Я подозреваю, что в вашем случае вы пытаетесь подключиться к порту 80 или 443. Я бы предложил использовать Nginx для направления трафика с этих портов на nodejs на более высоком порту, например, 8000 или что-то в этом роде.
Варикин
1
Спасибо что подметил это. Я не думаю, что конкретный скрипт, который я использовал, вызывал какой-либо из этих портов, я определенно не использую Node в качестве http-сервера. Возможно, это был один из модулей, которые я использовал, который требовал дополнительных разрешений? Я извиняюсь, что это было давно, поэтому я даже не уверен, какой сценарий вызвал это решение. Я добавлю заявление об отказе от попыток сделать это в производственной среде.
CauselessEffect
12

Это потому, что порт, который вы используете для запуска скрипта, уже используется. Вы должны остановить все другие узлы, которые используют этот пост. для этого вы можете проверить все узлы по

ps -e

ИЛИ только для использования процесса узла ps -ef | grep node Это даст вам список всех процессов узла с идентификатором

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

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>
marcdahan
источник
1
Чем это отличается от применения принятого ответа к ответу Марка?
EWit
3

Порт, который пытается использовать Node, может уже использоваться другой программой. В моем случае это был ntop , который я недавно установил. Мне пришлось открыть http: // localhost: 3000 / в браузере, чтобы понять это. Другой способ найти процесс дан здесь .

Фабьен
источник
2

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

Сунеха Джавид
источник
2

это означает, что ваш файл работает сейчас. просто введите ниже код и попробуйте снова:

sudo pkill node
Абольфазл Миадиан
источник
1

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

Джейк МакГвайр
источник
1

Если вы попытались убить все экземпляры узлов и другие службы, прослушивающие 3000 (по умолчанию используется для экспресс-настройки скелета), но безрезультатно, вам следует убедиться, что ваша среда не определяет «порт» как нечто неожиданное. В противном случае вы, вероятно, получите ту же ошибку. В файле app.js экспресс-скелета вы увидите строку 15:

app.set('port', process.env.PORT || 3000);
отметка
источник
1

Чтобы это исправить, завершите или закройте сервер, на котором вы работаете. Если вы используете Eclipse IDE, следуйте этому,

Run> Debug

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

Щелкните правой кнопкой мыши запущенный процесс и нажмите « Завершить» .

Прашант Самс
источник
1

events.js: 183 throw er; // необработанное событие error

Я также получил такую ​​же проблему и перепробовал много способов, но в конце концов получил это, это работает хорошо:

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

Обратитесь по этой ссылке для получения дополнительных разъяснений https://github.com/ionic-team/ionic-cli/issues/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);
});

Это сработало для меня.

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

cbaigorri
источник
0

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

sudo service NAMEOFSERVICE stop
стог
источник
0

В моем случае проблема была вызвана тем, что вы забыли вызвать вызов next()метода `use 'в expressjs.

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

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

Эндрю Дуайер
источник
0

Вы также можете изменить порт из Gruntfile.js и запустить снова.

Нарендра Соланки
источник
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

CodeRider
источник
0

Ни один из ответов не сработал для меня.

Когда я перезагружал свой компьютер, я мог запустить и запустить сервер.

макинтош
shutdown now -r

Linux
sudo shutdown now -r

tiagomenegaz
источник
0

-> проверьте, что работает на порте 8080 или на каком порте вы хотите проверить

lsof -i @localhost:8080

если что-то работает, вы можете закрыть его или использовать команду kill, чтобы закрыть его

rabiaasif
источник
0

Просто проверьте свой объект в коде Visual Studio. Поскольку я запускал свое приложение для узлов и я переводил компьютер в спящий режим, то на следующее утро я снова включил свой ноутбук в разработку программного обеспечения. Затем я снова запускаю команду nodemon app.js. Первый процесс запускался ночью, а второй выполнял мою последнюю команду, поэтому две командные строки прослушивают одни и те же порты, поэтому вы получаете эту проблему. Просто закройте один терминал или все терминалы, затем запустите ваш узел app.js или nodemon app.js.

Заиб
источник
0

Порт, который вы слушаете, уже прослушивается другим процессом.

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

  1. Список элементовоткрытых окон PowerShell
  2. тип ps а затем вы можете получить список процессов
  3. найдите процесс с именем node и обратите внимание на Id
  4. типа Stop-process <Id> я думаю что это помощь для пользователей windows
Ануш
источник
0

Я столкнулся с той же проблемой сегодня, и порт не использовался. Помог следующий подход:

rm -rf node_modules && npm cache clean && npm install
npm start
seb_dom
источник
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 . Тогда проблема ушла

Shravan
источник
-1

Просто измените ваш порт, возможно, ваш текущий порт используется iis или другим сервером.

Акаша
источник
На это спросили и ответили 4 года назад с тем же, но лучшим ответом.
Джордж