如何修复错误:在使用nodejs时听EADDRINUSE?

Dan*_*Fox 439 javascript node.js

如果我运行端口80的服务器,并尝试使用xmlHTTPrequest我得到此错误:Error: listen EADDRINUSE

如果我想要请求,当我在端口80上运行服务器时,为什么nodejs有问题呢?对于网络浏览器来说这不是问题:我可以在互联网上冲浪,而服务器正在运行.

服务器是:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);
Run Code Online (Sandbox Code Playgroud)

请求:

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();
Run Code Online (Sandbox Code Playgroud)

小智 535

对我有用的是:

killall -9 node
Run Code Online (Sandbox Code Playgroud)

但这会杀死一个系统进程.

ps ax
Run Code Online (Sandbox Code Playgroud)

你可以检查它是否有效.

  • 超过150个投票的解决方案相当于使用木槌击中您的软件. (17认同)
  • 这里的问题是你们在第一次运行后没有正常退出节点进程.因此,节点仍然绑定到该端口.`ps aux | grep node`会显示出来.而不是使用**CTRL + Z**杀死应用程序,而是使用**CTRL + C**退出应用程序.这将优雅地退出应用程序并删除端口绑定. (12认同)
  • 在相关的说明中,您也可以阅读[我什么时候不应该-9进程](http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) . (2认同)
  • 这个解决方案很有问题,因为 -9 标志会在不释放内存的情况下终止进程。您真的应该仅将其用作最后的解决方案。 (2认同)

ste*_*ewe 402

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);
Run Code Online (Sandbox Code Playgroud)

  • 如果服务器已经在监听,这还会抛出错误吗? (5认同)

Nob*_*ita 265

前面提到的killall -9 node,Patrick的工作按预期工作并解决了问题,但您可能想要阅读这个答案的编辑部分,了解为什么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)
Run Code Online (Sandbox Code Playgroud)

然后就做(ps - 实际上没有.请继续阅读下面):

kill -9 57385

你可以在这里阅读更多相关信息.

编辑:我今天正在阅读一个相当相关的主题,并偶然发现了这个有趣的线程,为什么我不应该kill -9进行处理.

通常,你应该在kill -9之前使用kill -15来为目标进程提供一个自我清理的机会.(进程无法捕获或忽略SIGKILL,但是它们可以并且经常捕获SIGTERM.)如果您没有给进程一个机会完成它正在进行的操作和清理,它可能会留下损坏的文件(或其他状态)一旦重新启动它将无法理解.

因此,如上所述,您最好使用以下方法终止上述过程:

kill -15 57385

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

以正确的方式退出流程将在关闭时释放该端口.这将允许您重新启动该过程,而无需在自己再次重新运行之前自行终止它.

  • `pgrep node`显示是否有任何节点进程已经逃脱.`pkill node`会杀死他们. (2认同)
  • 不是为了Windows,伙计们 - 你必须尝试另一个端口或重新启动计算机:P (2认同)

Rob*_*ans 60

**在下行之前 - 请阅读答案.这是相关的!如果您要对此进行投票,请留下评论,为什么您认为它不相关.


只是抬头,Skype有时会在端口80上侦听,因此如果您尝试从Node.js或任何其他应用程序侦听端口80,则会导致此错误.

您可以通过访问选项并单击高级 - >连接 - >使用端口80(取消此操作)来关闭Skype中的行为

关闭Skype端口80的使用

  • 这是我见过的最令人哭笑不得的设计缺陷之一.Skype开发者有多疯狂,他们会*考虑超过80或443? (15认同)
  • PS完成更改后,请不要忘记重启Skype! (14认同)
  • 但是,你的调试技能大+1,Rob. (5认同)

Yak*_*ein 36

您应该尝试终止正在侦听端口80的进程.

Killall会杀死所有运行的节点应用程序.你可能不想那样做.使用此命令,您只能杀死正在侦听已知端口的一个应用程序.

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

sudo fuser -k 80/tcp    
Run Code Online (Sandbox Code Playgroud)


Jav*_*bos 25

pkill node 在运行脚本之前应该完成这项工作.

  • 如果您想稍微小心一点,请先查看pgrep node,然后看看正在运行哪些node进程。 (2认同)

Was*_*siF 23

错误原因:您正在尝试使用忙碌port number

在Windows/Mac上有两种可能的解决方案可以解决此问题

  1. 免费当前使用的端口号
  2. 为当前程序选择另一个端口号


1.免费端口号码

视窗

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

苹果电脑

你可以试试netstat

netstat -vanp tcp | grep 3000
Run Code Online (Sandbox Code Playgroud)

对于OSX El Capitan和更新版(或者如果您的netstat不支持-p),请使用lsof

sudo lsof -i tcp:3000
Run Code Online (Sandbox Code Playgroud)

如果这不能解决您的问题,Mac用户可以参考有关此问题的完整讨论在Mac上查找(和终止)进程锁定端口3000


2.更改端口号?

视窗

set PORT=5000
Run Code Online (Sandbox Code Playgroud)

苹果电脑

export PORT=5000
Run Code Online (Sandbox Code Playgroud)


Pra*_*ain 17

lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393
Run Code Online (Sandbox Code Playgroud)

  • 请在您的答案中添加更多上下文,以帮助未来的读者理解代码/命令。 (4认同)

小智 16

您的应用程序已在该端口8080上运行.使用此代码终止端口并再次运行代码

sudo lsof -t -i tcp:8080 | xargs kill -9
Run Code Online (Sandbox Code Playgroud)


Eva*_*oll 15

另一件可能导致此错误的事情是同一节点代码中的两个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')); 
});                                                                   
Run Code Online (Sandbox Code Playgroud)

而且,它触发了这个错误.


hie*_*trq 14

这对我有用(我正在使用mac).运行此命令

lsof -PiTCP -sTCP:LISTEN

这将显示您的系统正在使用的端口列表.找到PID您的节点正在运行

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node      17269 hientrq   16u  IPv6 0xc42959c6fa30c3b9      0t0  TCP *:51524 (LISTEN)
node      17269 hientrq   19u  IPv4 0xc42959c71ae86fc1      0t0  TCP localhost:1337 (LISTEN)
Run Code Online (Sandbox Code Playgroud)

并运行 kill -9 [YOUR_PID]


Tha*_*han 11

EADDRINUSE意味着端口(我们尝试在节点应用程序中侦听)已经被使用.为了克服这个问题,我们需要确定哪个进程正在运行该端口.

例如,如果我们试图在3000端口中监听我们的节点应用程序.我们需要检查该端口是否已被任何其他进程使用.

步骤1:

$sudo netstat -plunt |grep :3000
Run Code Online (Sandbox Code Playgroud)

上面的命令给出了以下结果.

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node
Run Code Online (Sandbox Code Playgroud)

第2步:

现在您获得了进程ID(25315),杀死了该进程.

kill -9 25315
Run Code Online (Sandbox Code Playgroud)

第3步:

npm run start
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案适用于linux用户.


小智 7

sudo kill $(sudo lsof -t -i:80)

强行杀死

sudo kill -9 $(sudo lsof -t -i:80)

使用cmd以上杀死特定端口,然后运行您的服务器


Anu*_*rya 6

尝试这两个命令,它将停止所有节点进程。

killall 9 node
pkill node
npm start 
Run Code Online (Sandbox Code Playgroud)


Jee*_*Mok 6

有一种方法可以使用任务管理器终止进程:

请注意,此解决方案仅适用于 Windows

  1. 转到任务管理器(或使用快捷方式Ctrl+ Shift+ Esc

  2. 在“后台进程”上,找到“Node.js”进程并终止它们(右键单击它们并选择“结束任务”)

在此处输入图片说明

  1. 现在你应该可以重新开始


Ban*_*nas 6

我有:

Error: listen EADDRINUSE: address already in use :::8000
Run Code Online (Sandbox Code Playgroud)

我试图寻找侦听端口 8000 的进程
,但没有成功 - 没有
( sudo netstat -nlp | grep 8000)。

原来app.listen(8000)我的剧本里写了两遍。

我的假设是,干扰仅在尝试运行脚本时的短时间内发生,因此在错误之前和之后查找侦听端口的进程没有显示任何信息。


小智 5

当您要在其上运行应用程序的端口上运行任何进程时,就会出现此错误。

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

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

tcp 0 0 IP地址:3000 LISTEN 26869 / node

现在您可以杀死该进程sudo kill -9 26869


小智 5

在下面的命令中替换您的端口号

sudo lsof -t -i tcp:portNumber | xargs kill -9
Run Code Online (Sandbox Code Playgroud)


Sid*_*ava 5

EADDRINUSE 表示您的 nodejs 应用程序的端口已在使用中。

  • 现在您已经终止了在该端口上运行的进程/应用程序。
  • 通过以下方式查找应用程序的进程 ID:

lsof -i tcp:3000

  • 现在你将从这里获得进程ID。
  • 运行这个:

kill -9 进程ID