如何修复错误:在使用 NodeJS 时监听 EADDRINUSE?

IT技术 javascript node.js
2021-02-04 02:07:46

如果我使用端口 80 运行服务器,并且尝试使用XMLHttpRequest,则会收到此错误:Error: listen EADDRINUSE

如果我想在端口 80 上运行服务器时发出请求,为什么 NodeJS 会出现问题?对于网络浏览器来说,这不是问题:我可以在互联网上冲浪,而服务器正在运行。

服务器是:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

和请求:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();
6个回答

对我真正有帮助的是:

killall -9 node

但这会杀死一个系统进程。

ps ax

你可以检查它是否有效。

也为我。在我的情况下,我只运行了两次监听函数并在第二次出现错误
2021-03-20 02:07:46
这里的问题是你们在第一次运行后没有优雅地退出节点进程。因此,节点仍然绑定到该端口。ps aux | grep node会表明。不要使用CTRL+Z终止应用程序,而是使用CTRL+C退出应用程序这将优雅地退出应用程序并删除端口绑定。
2021-03-26 02:07:46
在相关说明中,您还可以阅读何时不应 kil -9 a process
2021-04-01 02:07:46
这个解决方案很有问题,因为 -9 标志会在不释放内存的情况下终止进程。您真的应该仅将其用作最后的解决方案。
2021-04-05 02:07:46
超过 150 票赞成的解决方案等同于用木槌敲击您的软件。
2021-04-10 02:07:46

EADDRINUSE意味着listen()尝试将服务器绑定到的端口号已在使用中。

因此,在您的情况下,必须已经在端口 80 上运行服务器。

如果你有另一个网络服务器在这个端口上运行,你必须把 node.js 放在那个服务器后面并通过它代理它。

您应该listening像这样检查事件,看看服务器是否真的在监听:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);
对我来说,这是由 Skype 引起的
2021-03-22 02:07:46
如果服务器已经在侦听,这是否仍然会引发错误?
2021-03-29 02:07:46
我只运行这台服务器。在我启动服务器之前,xmlhttprequest 有效。在我在端口 80 上启动服务器后,服务器也可以完美运行。但是,如果我在启动服务器后执行 xmlhttprequest,则会出现此错误。
2021-04-01 02:07:46

前面提到的killall -9 node,由帕特里克建议按预期工作并解决了问题,但您可能想阅读这个答案的编辑部分,了解为什么kill -9可能不是最好的方法。

最重要的是,您可能希望针对单个进程,而不是盲目地杀死所有活动进程。

在这种情况下,首先获取在该端口上运行的进程的进程 ID (PID)(比如 8888):

lsof -i tcp:8888

这将返回如下内容:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

然后就做(ps - 实际上不做。请继续阅读下面的内容):

kill -9 57385

您可以在此处阅读更多相关信息

编辑:我今天正在阅读一个相当相关的主题,并偶然发现了这个有趣的线程,为什么我不应该kill -9是一个进程

通常,您应该kill -9之前使用kill -15以让目标进程有机会在其之后进行清理。(进程不能捕捉或忽略 SIGKILL,但它们可以并且经常捕捉 SIGTERM。)如果你不给进程一个机会来完成它正在做的事情并清理它,它可能会留下损坏的文件(或其他状态)一旦重新启动它将无法理解。

因此,如上所述,您最好使用以下方法终止上述过程:

kill -15 57385

编辑 2:正如这里的评论中多次指出的,这个错误是没有优雅地退出进程的结果。这意味着,很多人使用CTRL+Z退出节点命令(或任何其他命令)停止正在运行的进程的正确方法是发出执行干净退出CTRL+C命令。

以正确的方式退出进程将在关闭时释放该端口。这将允许您重新启动该过程,而无需在能够再次重新运行它之前自行杀死它。

不适用于 Windows,伙计们-您必须尝试另一个端口或重新启动计算机:P
2021-03-11 02:07:46
我应该在哪里运行这个命令?在命令提示符下?在 NPM 控制台上?
2021-03-17 02:07:46
@UlyssesAlves 只需打开一个终端窗口并从那里终止进程。
2021-03-17 02:07:46
pgrep node显示是否有任何节点进程对您跑掉了。pkill node会杀了他们。
2021-03-22 02:07:46
@Nobita 这在 Windows 中有效吗?现在我意识到它可能是一个 MAC OS 命令。无论如何,我重新启动了我的 PC 并且不再出现此错误。我认为其他一些应用程序正在使用试图使用的相同端口节点。
2021-04-07 02:07:46

请注意,Skype 有时会侦听端口 80,因此如果您尝试从 Node.js 或任何其他应用程序侦听端口 80,则会导致此错误。

您可以通过访问选项并单击高级 -> 连接 -> 使用端口 80(取消勾选此选项)来关闭 Skype 中的该行为

关闭 Skype 端口 80 的使用

PS 进行更改后,不要忘记重新启动 Skype!

这是我见过的最令人哭笑不得的设计缺陷之一。疯狂是如何Skype的开发者,他们将以往任何时候都考虑接管80或443?
2021-03-11 02:07:46
不过,Rob 对您的调试技能大有加分。
2021-03-17 02:07:46
PS 进行更改后,不要忘记重新启动 Skype!
2021-03-25 02:07:46
是的,在想了想他们为什么要这样做之后,我想到了这一点。尽管如此,一个非常丑陋的kludge。默认情况下启用它的想法只是傲慢自大。
2021-03-27 02:07:46
@AJB 他们这样做是为了尝试穿透将出站流量限制为 http 请求的防火墙,但是在防火墙不使用 DPI 的情况下,只进行基本的端口阻塞。仍然......默认启用它有点愚蠢!
2021-04-02 02:07:46

您应该尝试终止正在侦听端口 80 的进程。

Killall 将杀死所有正在运行的节点应用程序。您可能不想这样做。使用此命令,您只能杀死一个正在侦听已知端口的应用程序。

如果使用 unix 试试这个命令:

sudo fuser -k 80/tcp    
您可能不想杀死所有正在运行的节点应用程序。
2021-03-17 02:07:46
谢谢!killalllsof -i 对我不起作用,但确实如此。
2021-04-02 02:07:46
谢谢亚基。killall 节点对我来说失败了,但这有效。
2021-04-06 02:07:46