如何解决错误:在使用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