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中Web服务器侦听的端口,或者在不需要时杀死当前正在使用该端口的端口。
go-oleg

如果关闭端口没有固定,请尝试> stackoverflow.com/a/52441297/6665568
Natesh bhat

Answers:


400

您曾经使用与8080相同的端口运行另一台服务器。

也许您node app在其他Shell中运行过,请关闭它,然后再次运行。

您可以检查端口号。可用或不使用

netstat -tulnp | grep <port no>

另外,您可以使用lsof

lsof -i :<port no>

4
我使用WebStorm遇到了这个问题。我在同一工作区中打开了两个调试会话。h!
尼克·柯伦

53
这样的常见错误确实值得更好的错误消息。
坦林2014年

使用node-activedirectory时,这发生在我身上。我的baseDN缺少子域。baseDN:'ldap:// dc = subdomain,dc = domain,dc = com'-2014
标记

正在运行rails server...:| 的实例
Sheharyar 2014年

1
在Mac High Sierra上:lsof -nP -i4TCP:$ PORT | grep LISTEN
Roee

60

有时我们运行快递应用程序时,也会得到类似的错误。在这种情况下,我们必须遵循相同的原则。我们需要检查其是否在任何终端上运行。如果要查找并终止进程,请按照下列步骤操作:

  • ps aux | grep节点
  • 找到进程ID(从左数第二个):
  • 杀死-9 PRCOCESS_ID

要么

使用单个命令关闭所有正在运行的节点进程。

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

5
ps aux | grep node | awk '{print $2}' | xargs kill -9
丹尼尔(Daniel)

killall -r node(在Linux中)
jt3k,2016年

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
仅以根用户身份运行脚本来解决此问题,这确实很危险。除非尝试绑定到1024以下的端口,否则永远不需要以root用户身份运行node。我怀疑在您的情况下,您正在尝试绑定到端口80或443。我建议使用Nginx将流量从这些端口定向到更高端口(例如8000或更高)上的nodejs。
varikin

1
感谢您指出了这一点。我不认为我使用的特定脚本调用了这些端口中的任何一个,我当然没有将Node用作http服务器。也许这是我使用的要求额外权限的模块之一?抱歉,已经有一段时间了,所以我什至不确定哪个脚本需要此解决方案。我将添加在生产环境中尝试此操作的免责声明。
CauselessEffect 2015年

12

这是因为用于运行脚本的端口已在使用中。您必须停止所有其他正在使用该帖子的节点。为此,您可以通过以下方式检查所有节点

ps -e

或仅用于节点进程,ps -ef | grep node 这将为您提供ID为的所有节点进程的列表

杀死所有节点的进程

sudo killall -9 node

或针对特定ID sudo kill -9 id


你救了我的夜!
Mujtaba Mahmood

8

我通过更改端口来修复了错误

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

并更改为:

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

1
这与将接受的答案说成Mark给出的答案有何不同?
EWit 2014年




1

关闭任何其他正在运行的节点服务器,即使它们在其他终端窗口中或在其他端口上运行也是如此。那应该解决问题。


1

如果您尝试杀死所有侦听3000(快速骨架设置所使用的默认值)的节点实例和其他服务均无济于事,则应检查以确保您的环境未将“端口”定义为意外情况。否则,您可能会遇到相同的错误。在快速骨架的app.js文件中,您会注意到第15行:

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

1

为了解决此问题,请终止或关闭您正在运行的服务器。如果您使用的是Eclipse IDE,请遵循此步骤,

运行>调试

在此处输入图片说明

右键单击正在运行的进程,然后单击终止



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 OS上,例如,您已将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(进程ID)

  • 运行sudo kill -9 16615(您必须在-9之后放置PID)

  • 再次启动服务器

0

就我而言,我也必须跑步vagrant reload。即使没有节点进程在我的虚拟机中运行我的快速应用程序,我仍然会收到此错误,直到重新加载无所事事的盒子。


0

停止使用该端口的服务。

sudo service NAMEOFSERVICE stop




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

如果使用Windows,则可以从任务管理器中结束node.js的进程


0

没有答案对我有用。

重新启动计算机后,我可以启动服务器并运行它。

苹果电脑
shutdown now -r

的Linux
sudo shutdown now -r


0

->检查8080端口上正在运行的端口或您要检查的端口

lsof -i @localhost:8080

如果有东西在运行,您可以将其关闭或使用一些kill命令将其关闭


0

很简单,只需在Visual Studio Code中检查您的终端设备即可。因为我正在运行节点应用程序,并且使笔记本电脑处于休眠状态,所以第二天早晨,我将笔记本电脑重新打开以进行软件开发。然后,我再次运行nodemon app.js命令。第二个命令是夜间运行的,第二个命令是运行我的最新命令的,所以两个命令提示符正在侦听相同的端口,这就是为什么出现此问题的原因。简单关闭一个终端或所有终端,然后运行您的节点app.js或nodemon app.js


0

您正在监听的端口已被另一个进程监听。

遇到此错误时,我使用Windows PowerShell终止了该进程(因为我使用Windows)

  1. 列表项打开Windows 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中,则全部与x86_64-apple-darwin13.4.0的IP有关。如果您遵循错误,则可能与x86_64-apple-darwin13.4.0有关。加

127.0.0.1 x86_64-apple-darwin13.4.0

/ etc / hosts文件。然后问题就消失了


-1

只需更改端口,可能是iis或其他服务器正在使用当前端口。


这是在4年前提出的,但答案却是相同但更好的答案。
乔治
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.