为什么我反复出现EADDRINUSE错误

时间:2020-05-29 17:05:02

标签: node.js reactjs localhost port

我可能知道这个问题的答案,但是如果我遗漏了一些东西,我正在寻求确认。

我处于全栈Node / React项目的开发模式。我的服务器在端口5000上运行。我的客户端在端口3000上运行。我正在将前端路由代理到实际IO的节点。所有这些似乎都运行良好。

我正在家庭办公室工作,所以每天晚上我下班时,我都只是离开工作。那天晚上的某个晚上,我的机器将我注销了。这可能不是最佳做法。

下一个工作日,我坐下工作,登录,执行npm run dev(同时运行)。通常,前端出现问题。但是(即使应用程序正常执行),我的控制台也会显示ERRADDRINUSE ::: 5000。

看起来一切正常,但我想可能有什么在等我。而且,它还表明它不是完全良性的。

这是我的想法。我确实每天晚上都会自动注销,但是显然不必关闭端口(至少不是关闭端口5000)。我想我可能应该执行一下,并且实际上每晚关闭或重新启动。

我是对的吗?而且,当您确认时,您会介意包括“为什么”吗?我仍在学习中。谢谢。

2 个答案:

答案 0 :(得分:0)

当已经有一个正在侦听端口5000的进程时,出现ERRADDRINUSE。再次启动节点进程之前,请检查进程是否正在运行。

ps -A | grep node

如果出于某种原因需要重新启动该进程,则可能要先终止该进程,然后尝试再次启动它。

答案 1 :(得分:0)

TLDR:

运行ps aux | grep node将允许您确定正在侦听端口5000时正在侦听的进程的PID,您可以使用kill -9 PID将其杀死。 (其中PID是挂起进程的进程ID)


更多解释:

您的两台服务器分别在系统中作为独立的进程运行。如果运行top之类的命令行程序,则将能够列出正在运行的进程,包括进程标识符或PID。

当系统状态更改(注销,关闭,失去网络连接)时。操作系统发出信号(有时称为软件中断)。然后,该过程负责确定接收信号后如何进行。 (对此有单独的代码称为信号处理程序)。大多数现代Web框架已经内置了信号处理程序,以响应常见的信号。

通常,在发出SIGTERM信号时终止处理,或者在发出SIGKILL信号时强制停止处理。

但是,有时会挂起一个进程并不少见。 (我以前在nodejs服务器上已经看到了)。要停止它们,最简单的方法是自己手动向过程发出SIGTERM(正常停止过程)或SIGKILL信号(强制停止过程)。

kill -9 PID命令可用于向进程发出SIGKILL信号。

有关此的更多信息,请参见有关进程和/或信号的Linux手册页。