如何解决错误:使用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的行为(取消这个)
您应该尝试杀死在端口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
工作…所以
- 打开你的任务pipe理器
- 在进程选项卡上,右键单击名称或任何列,然后select包含PID
- 按PIDsorting,然后右键单击右侧PID并单击结束任务。
现在,在Windows上没那么有趣的练习,我意识到我可以使用任务pipe理器,并find节点引擎,并结束它。
仅供参考,我使用Visual Studio Code在3500端口上运行Node,并且在VS代码中使用Git Bash shell。 我已经用Ctrl + C优雅地退出了,但是有时这并不能杀死它。 我不想改变我的端口或重新启动,所以这个工作。 希望它可以帮助别人。 否则,它是我自己的文档。
在我的情况下重新启动Ubuntu的是有益的。