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

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

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

EADDRINUSE, Address already in use

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

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


当前回答

我还有另一个问题。我已经申报了两次港口。不要再犯那个错误了。

app.listen(port, function () {
  console.log('Example app listening on port')
})

app.listen(3000, function() {
  console.log("Server started on port 3000");
});

而是这样做:

const port = 3000;

app.listen(port, function () {
  console.log('Example app listening on port')
})

其他回答

首先找出正在运行的是什么:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

你会得到这样的东西:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

然后你可以像下面这样终止进程:

sudo kill 110

然后,您将能够运行而不会得到listen EADDRINUSE:::3000错误

你也可以通过命令行方式:

ps aux | grep node

来获取进程id。

然后:

kill -9 PID

在kill时执行-9会发送SIGKILL(而不是SIGTERM)。 SIGTERM有时会被节点忽略。

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

在Linux上。

给~/.bashrc添加函数:

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

Pull changes: source ~/.bashrc

并使用它:killTcpListen 3000

这意味着你有两个节点服务器运行在同一个端口上,如果一个运行在端口上,比如3000,将另一个端口更改为另一个端口,比如3001,一切都将正常工作