对nodejs中的server.listen()重新使用相同的端口



我运行的是Ubuntu 18.04,并且有Express 4.16.3。每次运行服务器时,我都必须更改侦听端口。

我得到的错误信息是:

侦听EADDRINUSE:::8080

server.js

import express from 'express';
const server = express();
server.get('/',(req,res)=>{
res.send('Helo Express');
});
server.listen(8080, ()=>{
console.info('Listening on port 8080');
});

有人能解释一下为什么会发生这种情况吗?并提出可能的解决方案?

您的操作系统的端口8080似乎正被另一个进程使用。

如果您正在使用8080端口,请使用:sudo nmap -sT -O localhost进行检查,如果是,只需为Node.js服务器更改要侦听的端口号,以查找未使用的端口。

我制作了一个shell脚本,并自动化了杀死过程。

nkill.sh

pid=$(pgrep node);
pida=($pid);
for ((i=0;i<${#pida[*]};i++));
do 
sudo kill -9 ${pida[$i]};
echo "Killing "${pida[$i]};
done
echo "!!KILLS COMPLETE!!"

您需要使用server.close()来释放端口。但是,这应该在退出时运行。

我使用inits来管理我的启动和关闭,我正在编写一些示例代码来说明它,但如果你阅读它的文档,它会非常简单。


编辑:我有点过时了,server.close不在Express 4中。但是,这就引出了一个问题,您现在是如何启动和停止应用程序的?当您尝试启动一个新实例时,最后一个实例看起来确实还在运行。

这只是解决问题的变通方法。你能试着使用nodemon吗。因为如果在您的代码中检测到任何更改,这将自动重新启动您的服务器(即在文件更改时重新启动服务器(。

因此,您可以使用以下命令运行服务器:

nodemon服务器.js

如果以上不起作用,则使用此

const port = 8080
function startServer() {
server.listen(port, err => {
if(err) {
port++;
startServer()
} else {
console.log('Server running on port:', port)
}
})
}

这将扫描一个可用端口,然后在控制台上打印相同的端口。

正如错误所暗示的,您的nodeJS应用程序正在尝试侦听端口8080,但该端口已被另一个应用程序使用,该应用程序可能不一定是节点应用程序,您可以通过将端口更改为另一个您知道是免费的端口(例如4000(来轻松解决此问题。

此外,如果您坚持使用8080端口,请检查您是否有skype或任何其他使用8080的应用程序,并在重试之前关闭它们。

最新更新