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)

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


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>

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

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

killall -r node(в linux)
jt3k

25

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

killall node

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


1
узел killall -9
Панкадж Шинде

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 Это даст вам список всех процессов узла с идентификатором

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

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

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


2

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



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


0

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

sudo service NAMEOFSERVICE stop

0

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

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

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


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

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.