如何解决错误:在使用nodejs时监听EADDRINUSE?

如果我使用端口80运行服务器,并尝试使用xmlHTTPrequest,则会出现此错误: Error: listen EADDRINUSE

为什么nodejs的问题,如果我想要做一个请求,而我在端口80上运行服务器? 对于网页浏览者来说,这不是一个问题:我可以在服务器正在运行的同时在互联网上浏览。

服务器是:

  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();

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

所以,就你而言,必须在端口80上运行服务器。

如果您在此端口上运行另一个Web服务器,则必须将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);

真正帮助我的是:

killall -9 node

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

ps ax

你可以检查它是否工作。


Patrick提出的上述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一个进程。

一般来说,在杀死-9之前,你应该使用kill -15来给目标进程一个清理自己的机会。 (进程无法捕获或忽略SIGKILL,但它们可以并经常捕获SIGTERM。)如果您没有让进程有机会完成正在执行和清理的内容,则可能会导致损坏的文件(或其他状态)一旦重新启动它将无法理解。

所以,如上所述,你应该更好地杀死上述过程:

kill -15 57385

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

以正确的方式退出流程将在关闭时释放该端口。 这样可以让您重新启动该进程,而无需再次重新运行之前自行处理它的麻烦。

链接地址: http://www.djcxy.com/p/87235.html

上一篇: How to fix Error: listen EADDRINUSE while using nodejs?

下一篇: Postgres uses usual array index instead of intarray index