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

你可以检查它是否工作。

前面提到的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命令。

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

**之前下调 – 请阅读答案。 这是相关的! 如果你打算低估这个,留下评论为什么你认为这是不相关的。


只是一个头,Skype有时会听80端口,因此如果你尝试从Node.js或任何其他应用程序监听端口80,会导致此错误。

您可以通过访问选项并点击高级 – >连接 – >使用端口80来closuresSkype的行为(取消这个)

关闭Skype端口80的使用

您应该尝试杀死在端口80上侦听的进程。

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

如果使用unix,请尝试以下命令:

 sudo fuser -k 80/tcp 

另一件可以给出这个错误的东西是两个HTTP服务器在同一个节点代码中。 我正在更新一些Express 2 Express 3的代码,并有这个…

 http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); // tons of shit. http.createServer(app).listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); 

而且,它引发了这个错误。

运行你的脚本之前, pkill node应该做这个工作。

我也有同样的问题,我只是closuresterminal,并打开一个新的terminal并运行

 node server.js 

再次。 这对我有用,有一段时间只需要等待几秒钟,直到它再次工作。

但是,这只适用于开发人员而不是服务器控制台。

如果在要运行应用程序的端口上运行任何进程,则会出现此错误。

如何获取在该端口上运行哪个进程=>命令:sudo netstat -ap | grep:3000

输出:您将获得使用该端口的进程信息

tcp 0 0 IP地址:3000 LISTEN 26869 /节点

现在你可以杀死那个进程sudo kill -9 26869

错误:侦听EADDRINUSE意味着您要分配/绑定到您的应用程序服务器的端口已被使用。 您可以将另一个端口分配给您的应用程序。

或者,如果你想分配相同的端口到应用程序。 然后杀死在你想要的端口上运行的应用程序。

对于节点应用程序,您可以尝试的是,通过以下方式查找节点应用程序的进程ID:

 ps -aux | grep node 

获得进程ID后,执行

 kill process_id 

我在http.client之前(在node中)看到了这个错误,并且我记得,这个问题与不初始化httpClient或在httpClient创build和/或url请求中设置错误选项有关。

在Debian上,我发现在80端口上运行,你需要以root身份执行命令

 sudo node app.js 

我希望它有帮助

在杀死NODE_PORT的同时,它可能会杀死你的chrome进程或任何正在监听同一个端口的进程,这很烦人。

这个shell脚本可能是有帮助的 – 在我的情况下,端口是1337,但你可以随时更改它

 # LOGIC CHROME_PIDS=`pidof chrome` PORT_PIDS=`lsof -t -i tcp:1337` for pid in $PORT_PIDS do if [[ ${CHROME_PIDS} != *$pid* ]];then # NOT FOUND IN CHROME PIDS echo "Killing $pid..." ps -p "$pid" kill -kill "$pid" fi done sails lift # OR 'node app' OR whatever that starts your node exit 

在我的情况下,我使用虚拟主机,但在本地主机是一样的,我用:

 ps -aef | grep 'node' 

为了观看节点进程,控制台显示带有PID的进程。 为了杀死进程你必须使用这个命令:

 kill -9 PID 

其中PID是上述命令的进程ID。

两台服务器不能在同一个端口上侦听,所以请检查是否有其他服务器侦听同一个端口,如果在同一个端口上运行,也检查浏览器同步

如果你想解决这个问题

$ node server events.js:141 throw er; //未处理“错误”事件^

错误:在位于Server._listen2(net.js:1250:14)处的exports._exceptionWithHostPort(util.js:930:20)处,在Object.exports._errnoException(util.js:907:11)处侦听EADDRINUSE ::: 3000在EventEmitter.listen(C:\ sendbox \ mean \ node_modules \ express \ lib \ application .js:617:24)处的Server.listen(net.js:1382:5)处侦听(net.js:1286:10)目的。 (Module.js:409:26)在模块的Object.Module._extensions..js(module.js:416:10)上​​的位置(C:\ sendbox \ mean \ server.js:28:5)加载(module.js:343:32)

将您的端口号更改为8000

Windows开放源代码总是很棘手..

改变港口只是它的工作

 node-inspector --web-port=8099 

对于其他人在Windows 10的节点作为localhost并运行在像3500端口,而不是80 …

什么不行:

 killall ? command not found ps -aux | grep 'node' ? ps: user x unknown 

什么显示信息,但仍然没有工作:

  ps -aef | grep 'node' ps ax kill -9 61864 

什么工作:

Git Bash或Powershell在Windows上

  net -a -o | grep 3500 (whatever port you are looking for) 

注意PID(最右边)
我不能让killall工作…所以

  1. 打开你的任务pipe理器
  2. 在进程选项卡上,右键单击名称或任何列,然后select包含PID
  3. 按PIDsorting,然后右键单击右侧PID并单击结束任务。

现在,在Windows上没那么有趣的练习,我意识到我可以使用任务pipe理器,并find节点引擎,并结束它。

仅供参考,我使用Visual Studio Code在3500端口上运行Node,并且在VS代码中使用Git Bash shell。 我已经用Ctrl + C优雅地退出了,但是有时这并不能杀死它。 我不想改变我的端口或重新启动,所以这个工作。 希望它可以帮助别人。 否则,它是我自己的文档。

在我的情况下重新启动Ubuntu的是有益的。