我有一个简单的服务器运行在node.js使用连接:

var server = require('connect').createServer();
//actions...
server.listen(3000);

在我的代码中,我有实际的处理程序,但这是基本的思想。我一直遇到的问题是

EADDRINUSE, Address already in use

我收到这个错误时再次运行我的应用程序后,它以前崩溃或错误。因为我没有打开一个新的终端实例,所以我用ctr + z关闭了这个进程。

我非常确定我所要做的就是关闭服务器或连接。我尝试在进程中调用server.close()。(“退出”,…);运气不好。


当前回答

只杀死使用给定PORT的节点进程。正如其他人提到的,在bash中可以使用kill $(lsof -t -i:PORT)

这里有一个Windows解决方案(有一个方法!): Netstat -bona | findstr "。0:PORT +0.0.0.0:0 +LISTENING" | for /f "令牌=5" %t in ('more') do taskkill /PID:%t /f。你需要一个提升终端(在VSCode中,你需要通过提升来打开自己,因为集成终端不能被提升)。

PS:如果findstr不可用,您可以简单地使用查找和替换空格“+”(非正则模式)

其他回答

出现这个问题的原因是:

任何一个应用程序都可以在这个端口上运行,比如Skype。 节点可能已经崩溃,端口可能没有被释放。 您可能已经尝试启动多个服务器。为了解决这个问题,可以维护一个布尔值来检查服务器是否已经启动。只有当boolean返回false或undefined时才应该启动;

我想知道,为什么还没有人提到这种可能性:

如果你用字符串(有意或无意)提供::listen(port),这将不是一个有效的端口号表示,然后它可以在内部转换为端口号-1,然后引擎将尝试连接到那个-1端口,然后产生相同的EADDRINUSE错误,这反过来可能会有点混乱,让你在错误修复搜索的错误方向(hi, me xD)。

因此,在开始检查使用端口的进程之前,调试代码并检查传递给函数的确切内容。

Windows用户的UI解决方案:我发现顶部的答案对我不起作用,它们似乎是Mac或Linux用户的命令。我找到了一个简单的解决方案,不需要记住任何命令:打开任务管理器(ctrl+shift+esc)。查看正在运行的后台进程。找到任何Node.js并结束任务。

在我这么做之后,这个问题就消失了。正如在其他答案中所述,它的后台进程仍然在运行,因为之前遇到了一个错误,常规的退出/清理函数没有被调用,所以杀死它们的一种方法是在任务管理器中找到该进程并在那里杀死它。如果你从终端/powerShell运行进程,你通常可以使用ctrl+c来终止它。

我得到这个错误一次,并采取了许多方法在这里。

我的问题是我有两个app.listen(3000);在同一个app.js脚本中调用。第一个app.listen()在第二个抛出错误的地方成功了。

我遇到的另一个帮助我调试的有用命令是sudo fuser -k 3000/tcp,它会杀死你可能启动的任何恶意进程(一些进程可能会重新启动,例如,如果使用forever.js运行,但它对我很有用)。

在我的例子中,这个问题是由NodeJS环境引起的

两种解决方案:

打开任务管理器,关闭所有Nodejs进程(名称:Node.js JavaScript Runtime) 尝试将服务器的端口从3000更改为当前未被使用的其他端口(例如:3111)。