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

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

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

EADDRINUSE, Address already in use

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

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


当前回答

我也有同样的问题,但我发现这不是恶魔的问题。首先,我使用这个脚本开始我的过程:

{"dev": "nodemon -r dotenv/config app.js"}

应用程序可以正确启动,但只要任何文件改变,nodemon就不能重新启动它。与此同时,应用程序仍在后台继续运行。如果我按Ctrl+C,它退出,但端口3000上没有更多的进程,所以通过端口fuser -k 3000/tcp杀死它没有任何作用。

并且,我在app.js文件中使用。env端口。

const port = process.env.PORT || 3000;

因此,我只将端口值更改为3000,它就工作了。

const port = 3000;

我不得不找到另一种方法来加载.env文件,但这解决了我的问题。希望这能有所帮助。

其他回答

真的很简单,所有的操作系统..

npx kill-port 3000

尽管您的问题如上所述,但您需要捕获节点退出的不同方式

process.on('uncaughtException', (err, origin) => {
    console.log(err);
});

// insert other handlers.

我通常用

npx kill-port 3000

或者在我的mac上。

killall node

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

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

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

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

尝试更改端口号。这对我很管用。 例如,可以将端口号从3000修改为3001。