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

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

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

EADDRINUSE, Address already in use

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

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


当前回答

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

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

其他回答

在Windows上,我得到以下错误:

EADDRINUSE:地址已经在使用:::8081。

遵循以下步骤:

以管理员身份打开CMD 执行以下操作

命令netstat -ano|findstr "PID:8081"

得到以下流程:

通过:

Taskkill /pid 43144 /f

在MAC上你可以这样做:

raghavkhunger@MacBook-Air ~ % lsof -i tcp:8081 命令pid user fd类型设备大小/关闭节点名称 节点23722用户名24u IPv6 0xeed16d7ccfdd347 0t0 TCP *:sunproxyadmin (LISTEN)

username@MacBook-Air ~ % kill -9 23722

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

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

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

使用netstat获取所有节点进程和它们正在使用的端口,然后通过PID杀死你想要的唯一一个

netstat -lntp | grep node

您将获得所有节点进程

tcp6  0      0 :::5744    :::*    LISTEN     3864/node

然后当你得到PID(3864)时,通过PID终止进程

  kill -HUP PID 

节点正在内存中的某个地方运行,并且锁定了该端口。在Windows上,这个问题会发生,像大多数Windows问题一样,通过按CTRL+ALT+DEL和/或重新启动来解决。

出于对表格中所有答案的尊重,我想补充一点。

我发现,当我终止一个节点应用程序错误使用Ctrl + Z,非常下一次当我试图打开它得到相同的错误EADDRINUSE。

当我使用Ctrl + C终止一个节点应用程序时,下一次我打开它时,它没有任何问题。

将端口号更改为错误的端口号可以解决该问题。