如果我使用端口80运行服务器,并尝试使用xmlHTTPrequest我收到此错误: Error: listen EADDRINUSE
如果我想做一个请求,当我在端口80上运行服务器时,为什么nodejs有问题呢?对于web浏览器来说,这不是问题:我可以在互联网上冲浪,而服务器正在运行 .
服务器是:
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();
30 回答
EADDRINUSE
表示listen()
尝试绑定服务器的端口号已在使用中 .因此,在您的情况下,必须已经在端口80上运行服务器 .
如果您在此端口上运行另一个Web服务器,则必须将node.js放在该服务器后面并通过它进行代理 .
你应该检查这样的
listening
事件,看看服务器是否真的在听:对我有用的是:
但这会破坏系统进程 .
同
你可以检查它是否有效 .
前面提到的
killall -9 node
,Patrick的工作按预期工作并解决了问题,但您可能想要阅读这个答案的编辑部分,关于为什么kill -9
可能不是最好的方法 .最重要的是,您可能希望定位 single 进程而不是盲目地杀死 all 活动进程 .
在这种情况下,首先获取在该端口上运行的进程的进程ID(PID)(例如8888):
lsof -i tcp:8888
这将返回如下内容:
然后就做(ps - 实际上 do not . 请继续阅读下面的内容):
kill -9 57385
你可以阅读更多关于这个here的内容 .
EDIT: 我今天正在阅读一个相当相关的话题,并在why should i not kill -9 a process上偶然发现了这个有趣的话题 .
因此,如上所述,您最好使用以下方法终止上述过程:
kill -15 57385
EDIT 2 :多次noted in a comment around here这个错误是由于没有正常退出进程而造成的 . 这意味着,很多人使用 CTRL+Z 退出节点命令(或任何其他命令) . 停止正在运行的进程的正确方法是发出执行干净退出的 CTRL+C 命令 .
以正确的方式退出流程将在关闭时释放该端口 . 这将允许您重新启动该过程,而无需在自己再次重新运行之前自行终止它 .
**在下行之前 - 请阅读答案 . 这是相关的!如果你要对此进行投票,请留下评论,为什么你认为它不相关 .
只是抬头,Skype有时会在端口80上侦听,因此如果您尝试从Node.js或任何其他应用程序侦听端口80,则会导致此错误 .
您可以通过访问选项并单击高级 - >连接 - >使用端口80(取消此操作)来关闭Skype中的行为
您应该尝试终止正在侦听端口80的进程 .
Killall会杀死所有运行的节点应用程序 . 你可能不想这样做 . 使用此命令,您只能杀死正在侦听已知端口的一个应用程序 .
如果使用unix,请尝试以下命令:
在运行脚本之前
pkill node
应该完成这项工作 .您的应用程序已在该端口8080上运行 . 使用此代码终止端口并再次运行代码
另一件可能导致此错误的事情是同一节点代码中的两个HTTP服务器 . 我正在更新一些Express 2到Express 3代码,并且有这个......
而且,它触发了这个错误 .
这对我有用(我正在使用mac) . 运行此命令
lsof -PiTCP -sTCP:LISTEN
这将显示您的系统正在使用的端口列表 . 找到节点正在运行的
PID
并运行
kill -9 [YOUR_PID]
There are two options to resolve this issue in Windows/Mac
免费当前使用的端口号
为当前程序选择另一个端口号
1.免费端口号
Windows
Mac
你可以试试netstat
对于OSX El Capitan和更新版(或者如果您的netstat不支持-p),请使用lsof
如果这不能解决您的问题,
Mac
用户可以参考有关此问题的完整讨论Find (and kill) process locking port 3000 on Mac2.更改端口号?
Windows
Mac
EADDRINUSE
表示已经在使用端口(我们尝试在节点应用程序中侦听) . 为了克服这个问题,我们需要确定哪个进程正在运行该端口 .例如,如果我们试图在3000端口中监听我们的节点应用程序 . 我们需要检查该端口是否已被任何其他进程使用 .
step1:
以上命令给出了以下内容结果 .
step2:
现在您获得了进程ID(25315),杀死了该进程 .
step3:
注意:此解决方案适用于linux用户 .
强行杀死
使用cmd以上来杀死特定端口,然后运行您的服务器
当您在要运行应用程序的端口上运行任何进程时,会出现此错误 .
如何获取在该端口上运行的进程=> command:sudo netstat -ap | grep:3000
输出:您将获得使用该端口的进程信息
tcp 0 0 IPaddress:3000:LISTEN 26869 / node
现在你可以杀死那个进程sudo kill -9 26869
我也有同样的问题,我只是关闭终端并打开一个新的终端并运行
再次 . 这对我有用,有些时候只需要等待几秒钟直到它再次工作 .
但这仅适用于开发人员计算机而非服务器控制台 .
Error: listen EADDRINUSE 表示您要分配/绑定到应用程序服务器的端口已在使用中 . 您可以为应用程序分配另一个端口 .
或者,如果要将相同的端口分配给应用程序 . 然后终止在所需端口上运行的应用程序 .
对于节点应用程序,您可以尝试的是,通过以下方式查找节点应用程序的进程ID:
获取进程ID后,执行
我在使用http.client之前(在节点中)看到过这个错误,并且我记得,问题与不在httpClient创建和/或url请求中初始化httpClient或设置错误选项有关 .
在Debian上我发现在端口80上运行你需要以root身份发出命令,即
我希望它有所帮助
在我的情况下,Apache HTTP Server在端口80上运行,我通过以root身份发出命令来解决它
sudo killall httpd
Update
如果在Mac上安装并运行Jenkin;
你可以用
sudo lsof -i tcp:8080
查看如果是,并且您只想停止一次Jenkins,请运行:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
似乎还有另一个Node ng服务进程正在运行 . 通过在控制台(Linux / Mac)中键入它来检查它:
并退出:
或者替代使用
在您选择的免费端口上为您的项目提供服务 .
在杀死NODE_PORT时,它可能会杀死你的chrome进程或任何正在侦听同一端口的东西,这很烦人 .
这个shell脚本可能会有所帮助 - 在我的情况下,端口是1337,但您可以随时更改它
在我的情况下,我使用网络托管,但在本地主机中它是相同的,我用过:
然后,为了监视节点进程,控制台用PID显示进程 . 要杀死你必须使用此命令的进程:
其中PID是上述命令的进程ID .
两个服务器无法在同一端口上侦听,因此请检查其他服务器是否在同一端口上侦听,如果在同一端口上运行,还要检查浏览器同步
对于Windows 10上的其他人,节点为
localhost
并在像3500这样的端口上运行,而不是80 ...What does not work:
What shows information but still not does work:
What does work:
Windows上的Git Bash或Powershell
注意PID(最右边)
我无法工作......所以
打开任务管理器
在进程选项卡上,右键单击名称或任何列,然后选择包含PID
按PID排序,然后右键单击右侧PID并单击结束任务 .
在那之后,在Windows上不那么有趣的练习,我意识到我可以使用任务管理器并找到Node引擎并结束它 .
仅供参考,我使用Visual Studio Code在端口3500上运行Node,我在VS代码中使用Git Bash shell . 我已经使用Ctrl C优雅地退出了,但有时这并没有杀死它 . 我不想更改我的端口或重启,所以这工作 . 希望它能帮助别人 . 否则它是我自己的文档 .
对我有用的选项:
跑:
你会得到类似的东西:
错误
EADDRINUSE
(已在使用的地址)报告本地系统上已有另一个进程占用该地址/端口 .有一个名为find-process的npm包,它有助于查找(和关闭)占用过程 .
Here is a little demo code:
我准备了一个小样本,可以重现
EADDRINUSE
错误 . 如果在两个单独的终端中启动以下程序,您将看到第一个终端将启动服务器(在端口"3000"上),第二个终端将关闭已经运行的服务器(因为它阻止了第二个终端的执行,EADDRINUSE
) :Minimal Working Example:
我更喜欢这样做
killall -15 node
因为,
kill -15
为进程提供了清理自己的机会 . 现在,您可以通过验证ps aux | grep node
注意:如果您没有让进程有机会完成当前正在进行的操作并进行清理,则可能会导致文件损坏
我最近遇到了同样的问题 .
这意味着该端口已被其他应用程序使用(快递或其他软件)
在我的情况下,我不小心在两个终端上运行快递,所以使用'Ctrl C'退出终端为我修复了一些东西 . (仅从一个终端运行服务器)
希望它能帮助别人 .
在下面的命令中替换你的portNumber
Windows开源时总是很棘手..
改变端口只是它的工作原理
对于 windows users ,在PowerShell窗口中执行以下命令以终止所有节点进程 .