如何修复错误:在使用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();
817752 次浏览

我以前(在节点中)用http看到过这个错误。我记得,这个问题与没有初始化httpClient或在httpClient创建和/或url请求中设置错误的选项有关。

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);

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

你可以在Skype中通过访问选项并单击高级->连接->使用端口80(取消勾选)来关闭该行为

关闭Skype端口80使用

P.S.在做了这个改变后,不要忘记重新启动Skype!

另一个可能产生此错误的是相同节点代码中的两个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'));
});

它触发了这个错误。

真正帮助我的是:

killall -9 node

但是这会杀死一个系统进程。

ps ax

你可以检查它是否有效。

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

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

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

sudo fuser -k 80/tcp

我也有同样的问题,我只是关闭终端并打开一个新终端并运行

node server.js

一次。这对我来说是有效的,有时只需要等待几秒钟,直到它再次工作。

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

前面提到的由Patrick建议的killall -9 node可以按照预期工作并解决问题,但是你可能想要阅读关于为什么kill -9可能不是最好的方法的回答的编辑部分。

最重要的是,您可能希望以进程为目标,而不是盲目地杀死所有活动进程。

在这种情况下,首先获取该端口上运行的进程的进程ID (PID)(例如8888):

lsof -i tcp:8888 < /代码> < / p >

这将返回如下内容:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

然后只需执行(ps -实际上是。请继续阅读下文):

# EYZ0

你可以阅读更多关于在这里的内容。

我今天正在阅读一个相当相关的话题,偶然发现了为什么我不应该kill -9进程上这个有趣的帖子。

通常,您应该在kill - 9之前使用-15年杀,以便给目标进程一个自我清理的机会。(进程不能捕获或忽略SIGKILL,但它们可以并且经常捕获SIGTERM。)如果您不给进程一个机会来完成它正在做的事情和清理,它可能会留下损坏的文件(或其他状态),一旦重新启动,它将无法理解。

因此,如前所述,你应该更好地杀死上面的进程:

# EYZ0

编辑2:和在这里的一个评论中注意到一样,这个错误是由于没有正常退出进程造成的。这意味着,许多人使用CTRL + Z退出节点命令(或任何其他命令)。停止正在运行的进程的正确方法是发出CTRL + C命令,该命令执行干净的退出。

以正确的方式退出进程将在关闭时释放该端口。这将允许您重新启动进程,而不必在重新运行它之前自己杀死它。

在控制器环境下,你可以使用:

在运行脚本之前pkill node就可以完成这项工作。

记住,这个命令会杀死所有的node进程,如果你有一个容器只运行一个实例,这可能是正确的,如果你有这样的环境,你可以保证。

在任何其他场景中,我建议使用命令终止通过编程方式查找的某个进程id或名称。比如,如果你的进程被调用node-server-1,你可以使用pkill node-server-1

这个资源可能有助于理解: # EYZ0 < / p >

在Debian上,我发现要在端口80上运行,你需要以根用户的身份发出命令

sudo node app.js

我希望这对你们有帮助

当您希望在某个端口上运行应用程序时,将出现此错误。

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

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

tcp 00 IPaddress:3000 LISTEN 26869/node

现在您可以终止该进程 Sudo kill -9 26869

如果你想解决这个问题

$ node server events.js:141 把呃;//未处理的'错误'事件 ^ < / p >

Error: listen EADDRINUSE:::3000 在Object.exports。_errnoException (util.js 907:11): 在出口。_exceptionWithHostPort (util.js 930:20): 在服务器上。_listen2 (net.js 1250:14): (net.js:1286:10) 在服务器上。听(net.js 1382:5): 在EventEmitter。监听(C:\sendbox\mean\node_modules\express\lib\application .js:617:24) 在对象。(C: \ sendbox \ \ server.js:上28:5) 在模块。_compile (module.js 409:26): at Object.Module._extensions. js (module.js:416:10) 在模块。负载(module.js: 343:32) < / p >

将端口号更改为8000

当杀死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

错误:监听EADDRINUSE表示要分配/绑定到应用服务器的端口已经在使用中。您可以为您的应用程序分配另一个端口。

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

对于一个节点应用程序,你可以尝试的是,找到节点应用程序的进程id:

ps -aux | grep node

在获得进程id之后,执行

kill process_id

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

ps -aef | grep 'node'

为查看节点进程,则控制台显示PID的进程。 要杀死进程,你必须使用这个命令:

kill -9 PID

其中PID是上面命令中的进程id。

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

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

# EYZ0

Git Bash或Windows上的Powershell

  net -a -o | grep 3500   (whatever port you are looking for)
注意PID(最右)
我无法让killall工作…所以< / p >
  1. 打开任务管理器
  2. 在进程选项卡上,右键单击名称或任何列,并选择包含PID
  3. 按PID排序,然后右键单击右PID,然后单击结束任务。

现在,在windows上不那么有趣的练习之后,我意识到我可以使用任务管理器,找到Node引擎,然后结束它。

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

对于windows用户,在PowerShell窗口中执行以下命令杀死所有节点进程。

Stop-Process -processname node

这个选项对我来说是有效的:

运行:

ps -ax | grep node

你会得到这样的东西:

 8078 pts/7    Tl     0:01 node server.js
8489 pts/10   S+     0:00 grep --color=auto node
kill -9 8078

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

sudo lsof -t -i tcp:8080 | xargs kill -9

错误EADDRINUSE(地址已在使用)报告本地系统上已经有另一个进程占用该地址/端口。

有一个名为find-process的npm包可以帮助查找(并关闭)占用进程。

下面是一个小演示代码:

const find = require('find-process')


const PORT = 80


find('port', PORT)
.then((list) => {
console.log(`Port "${PORT}" is blocked. Killing blocking applications...`)
const processIds = list.map((item) => item.pid)
processIds.forEach((pid) => process.kill(pid, 10))
})

我准备了一个小样本,可以重现EADDRINUSE错误。如果你在两个不同的终端上启动下面的程序,你会看到第一个终端将启动一个服务器(在端口“3000”上),第二个终端将关闭已经运行的服务器(因为它阻止了第二个终端EADDRINUSE的执行):

最小工作示例:

const find = require('find-process')
const http = require('http')


const PORT = 3000


// Handling exceptions
process.on('uncaughtException', (error) => {
if (error.code === 'EADDRINUSE') {
find('port', PORT)
.then((list) => {
const blockingApplication = list[0]
if (blockingApplication) {
console.log(`Port "${PORT}" is blocked by "${blockingApplication.name}".`)
console.log('Shutting down blocking application...')
process.kill(blockingApplication.pid)
// TODO: Restart server
}
})
}
})


// Starting server
const server = http.createServer((request, response) => {
response.writeHead(200, {'Content-Type': 'text/plain'})
response.write('Hello World!')
response.end()
})


server.listen(PORT, () => console.log(`Server running on port "${PORT}"...`))

在我的情况下,Apache HTTP服务器运行在端口80上,我通过发出命令作为根来解决它

# EYZ0

# EYZ0

如果Jenkin已经安装并运行在你的Mac上;

  1. 你可以用sudo lsof -i tcp:8080检查它
  2. 如果是,并且你只想阻止Jenkins一次,运行:sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

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

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

步骤1:

$sudo netstat -plunt |grep :3000

上面的命令给出下面的结果。

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

步骤2:

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

kill -9 25315

步骤3:

npm run start

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

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

Windows/Mac有两种可能的解决方案

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

<人力资源>

1. 空闲端口号

窗户

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

enter image description here

Mac

你可以试试netstat

netstat -vanp tcp | grep 3000

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

sudo lsof -i tcp:3000

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

<人力资源>

2. 修改端口号?

窗户

set PORT=5000

Mac

export PORT=5000

我更喜欢做

# EYZ0

,因为kill -15给了进程一个自我清理的机会。 现在,您可以通过

来验证

# EYZ0

注意:如果您不给进程一个机会来完成它当前正在做的事情并进行清理,可能会导致文件损坏

EADDRINUSE翻译过来就是“你试图发出app.listen()的端口正在被其他程序使用”。您可以使用这样的脚本来检查端口是否正在使用,然后在app.listen()中更改端口。

var net = require('net');
var errors = ['EADDRINUSE'];
var isUsed = function(port) {
var tester = net.createServer()
.once('error', function (err) {
if (!errors.includes(err.code)) {
console.log("Port is in use, change the port.");
}
})
.once('listening', function() {
tester.once('close', function() {
console.log("You are good to go.");
})
.close()
})
.listen(port);
}

您还可以在errors数组中添加其他错误,以检查所有类型的错误。

我最近也遇到了同样的问题。

这意味着该端口已经被另一个应用程序(express或其他软件)使用。

在我的情况下,我不小心在2个终端上运行express,所以使用“Ctrl + C”退出终端为我解决了问题。(只从一个终端运行服务器)

希望它能帮助别人。

似乎有另一个Node ng服务进程正在运行。在你的控制台(Linux/Mac)中输入以下内容进行检查:

ps aux|grep node

然后用:

kill -9 <NodeProcessId>

或替代使用

ng serve --port <AnotherFreePortNumber>

在你选择的自由港口为你的项目服务。

这适用于我(我使用mac)。执行此命令

# EYZ0

这将显示系统正在使用的端口列表。找到节点正在运行的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)

执行kill -9 [YOUR_PID]

当我们意外地在同一个实例中有两个本地Express环境指向同一个端口时,得到此错误。

如果你已经找到了这些答案,我希望这将有助于解决你的问题。

Sudo kill $(Sudo lsof -t:80)

对于武力杀伤

Sudo kill -9 $(Sudo lsof -t:80)

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

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

sudo lsof -t -i tcp:portNumber | xargs kill -9

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

killall 9 node
pkill node
npm start

EADDRINUSE表示你的nodejs应用的端口已经被使用。

  • 现在你已经杀死了在该端口上运行的进程/应用程序。
  • 通过以下方式查找app的进程id:

-i tcp:3000

  • 现在你会从这里得到进程id。
  • 运行这个:

-9 processId

这发生在我身上是因为我的服务器在另一个终端窗口中运行。关闭连接解决了问题。

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

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

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

  1. 进入任务管理器(或使用快捷键Ctrl + Shift + Esc)

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

enter image description here

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

我有:

Error: listen EADDRINUSE: address already in use :::8000

<强>我试图寻找进程监听端口8000
并且没有运气-没有 (sudo netstat -nlp | grep 8000).

. sudo netstat -nlp | grep 8000 .

结果我在我的脚本中写了两次app.listen(8000)

我的假设是,在尝试运行脚本时,干扰只在很短的时间内发生,因此在错误前后查找侦听端口的进程不会显示任何干扰。

NOOB错误修复:我是Node.js的新手,并设置了一个监听端口8080的web服务器。我遇到EADDRINUSE错误。我尝试了所有不同的“杀死-9节点”迭代,并一直得到,“节点:没有发现进程”

问题是,我在调用http.listen(8080);在同一段代码中出现了两次。所以第一次它实际上工作得很好,第二次它抛出一个错误。

如果在尝试关闭端口时得到“no process found”响应,请尝试检查以确保只打开一次端口。

在ZSH中,当我输入exit时,我注意到一条消息:zsh: you have suspended jobs

  1. 输入单词jobs,点击enter
  2. 输入kill %1(其中%1是作业号),点击enter
  3. 响应应该声明terminated {job_name}

我找到了答案在这里

解决方法:

1:需要使用以下命令终止进程。

pm2 kill <

2:执行如下命令重新启动服务。

Pm2启动app.js——name"

3:执行以下命令检查服务器状态。

pm2列表

查看哪些进程正在使用该端口也很有用。

对于macOS,我从这篇文章中发现,AirPlay使用端口5000,所以即使你使用这里列出的解决方案杀死它,它也会再次占用端口5000。快速搜索谷歌,查看哪些常见应用程序或进程正在使用导致错误的端口。

实际上,你正在尝试运行在一个端口上,这个端口实际上被一些其他服务占用(通常是其他web服务器,如apache, iis等)。

  1. 判断哪个服务正在使用该端口

  2. 停止并重启节点服务器

或者换一个端口,比如8080、5000……

对于windows

netstat -ano -p tcp |find "80"

linux

 sudo lsof -i -P -n

如果你在nodejs中使用docker image,只需停止容器:

  • 获取nodejs的CONTAINER_ID
docker ps
  • 停止它
docker stop CONTAINER_ID
  • 或者如果你使用docker compose
docker compose stop nodejs_service_name