节点/ Express:EADDRINUSE,地址已在使用中-终止服务器

我有一个使用connect在node.js中运行的简单服务器:

var server = require('connect').createServer();
//actions...
server.listen(3000);

在我的代码中,我有实际的处理程序,但这就是基本思想。我一直遇到的问题是

EADDRINUSE, Address already in use

在先前崩溃或错误后再次运行我的应用程序时,我收到此错误。由于我没有打开终端的新实例,因此我使用结束了该过程ctr + z

我可以肯定,我要做的就是关闭服务器或连接。我打过电话server.close()process.on('exit', ...);,没有运气。

三千曜米亚2020/03/17 18:00:59

对于所有来此帖子并尝试过所有内容的人,可能都使用nodemon或永远使用它。例如,如果您运行,则 PORT=6060 Nodemon 可能会收到与正在使用端口6060相同的错误。

在这种情况下,如果您确实需要在运行期间定义端口,则可以在没有nodemon的情况下运行您的项目。另外,如果您想坚持使用nodemon,则可以在文件本身中定义端口。

对我来说我现在就这样做 PORT=6060 node app.js

梅Jim2020/03/17 18:00:59

就我而言,这是因为我打开了Eclipse ...

Davaid小哥2020/03/17 18:00:59

UI解决方案对于Windows用户:我发现最重要的答案对我而言不起作用,它们似乎是Mac或Linux用户的命令。我找到了一个简单的解决方案,不需要记住任何命令:打开任务管理器(ctrl + shift + esc)。查看正在运行的后台进程。找到任何Node.js并结束任务。

完成此操作后,该问题对我而言消失了。如其他答案中所述,由于先前遇到错误并且未调用常规退出/清除功能,因此后台进程仍在运行。

西门樱Eva2020/03/17 18:00:59

我想知道,为什么没有人提到这种可能性:

  • 如果您提供::listen(port)的字符串(有意或无意)不是有效的端口号表示形式,则可以在内部将其转换为端口号-1,然后ant引擎将尝试连接至该-1端口,然后产生相同的EADDRINUSE错误,反过来,这可能会造成一点混乱,并使您转向错误修复搜索的错误方向(嗨,我xD)。

因此,在开始检查使用port的进程之前,请调试代码并检查传递给函数的内容是什么

村村LEY2020/03/17 18:00:59

这意味着您有两个在同一端口上运行的节点服务器,如果其中一个在端口上运行,则假设3000将另一台服务器更改为另一个端口,例如3001,则一切正常

前端阳光2020/03/17 18:00:59

此问题的原因是:

  1. 像Skype这样的端口可能正在运行任何应用程序。
  2. 节点可能已崩溃,端口可能尚未释放。
  3. 您可能尝试启动多个服务器。为了解决这个问题,可以维护一个布尔值来检查服务器是否已经启动。仅当boolean返回false或undefined时,才应启动该方法。
凯乐2020/03/17 18:00:59

Win10,git bash v2.15,节点v8.9.1,npm v5.5.1

我有一个package.json脚本来启动节点: "start": "node index.js"

每当我使用此功能时,无论是否用ctrl + c杀死它,我都会遇到此问题。

如果我只是node index.js从git bash而不是npm run startctrl + c杀掉,那我就永远不会遇到这个错误。

我不确定为什么,但是我认为这可能会对某人有所帮助。

LEY老丝2020/03/17 18:00:59

server.close()需要一段时间才能关闭连接,因此我们应该这样进行异步调用:

await server.close();

重要提示:使用await时,我们必须在封装函数中使用async关键字,如下所示:

async () => {
  await server.close();
}
LEYL2020/03/17 18:00:59

在Linux上。

将功能添加到~/.bashrc

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

拉取更改: source ~/.bashrc

并使用它: killTcpListen 3000

GilNear2020/03/17 18:00:58

节点正在内存中的某个位置运行,并且该端口已锁定。在Windows上,将像大多数Windows问题一样,通过单击CTRL+ ALT+ DEL和/或重新启动来解决此问题

阿飞小卤蛋达蒙2020/03/17 18:00:58

在适当考虑表格中的所有答案之后,我想补充一点。

我发现,当我使用Ctrl + Z终止由于错误而终止的节点应用程序时,下一次我尝试打开它时出现了相同的错误EADDRINUSE。

当我使用Ctrl + C终止节点应用程序时,下一次我打开它时,它运行顺利。

将端口号更改为错误的端口号即可解决此问题。

十三神乐2020/03/17 18:00:58

您可以使用热节点来防止服务器崩溃/运行时错误。只要节点程序[源] /进程[运行节点程序]发生变化,热节点就会自动为您重新启动nodejs应用程序。

使用npm并使用全局选项安装热节点:

npm install -g hotnode

神奇老丝2020/03/17 18:00:58

任务管理器(ctrl + alt + del)->

进程选项卡->

选择“ node.exe”进程,然后单击“结束进程”

TomPro2020/03/17 18:00:58

您可能会遇到甚至杀死线程或进程实际上都不会终止应用程序的情况(在Linux和Windows上,我偶尔会发生这种情况)。有时您可能已经在运行一个尚未关闭的实例。

由于这种情况,我更愿意添加package.json

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

然后,我可以使用以下方式致电给他们:

npm run stop-win
npm run stop-Linux

如果需要的话,您可以做得更好,并用一个参数标志来执行那些BIN命令。您也可以将它们添加为要在try-catch子句中执行的命令。

DavaidTony宝儿2020/03/17 18:00:58

对于像我这样的 Visual Studio Noobs

您可能正在其他终端上运行该进程!

Visual Studio中关闭终端,终端便消失了

以为以前的一个被销毁的方式手动创建了一个新的。实际上,每次我单击“ 新终端”时,实际上是在以前的终端上创建一个新终端

所以我找到了第一个终端,然后……瞧,我在那儿运行服务器。

实现它的多个终端

JinJin伽罗小胖2020/03/17 18:00:58

首先找出正在使用什么:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

您将获得类似以下内容的信息:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

然后,您可以按照以下步骤终止该过程:

sudo kill 110

然后,您将能够运行而不会出现侦听EADDRINUSE ::: 3000错误

神乐逆天2020/03/17 18:00:58

仅供参考,您可以通过一个命令终止该进程 sudo fuser -k 3000/tcp可以对所有其他通常用于开发的端口(例如8000、8080或9000)执行此操作。

JinJinStafan2020/03/17 18:00:58

PowerShell用户:

Taskkill / IM node.exe / F

神无小宇宙2020/03/17 18:00:58
ps aux | grep node
kill -9 [PID] (provided by above command)

描述:


  1. ps将提供进程状态,aux提供以下列表:所有用户进程,u:用户自己的进程,x:未连接到终端的所有其他进程。
  2. 管道符号:| 将通过ps aux的结果进行进一步操作。
  3. grep将从ps aux提供的列表中搜索提供的字符串(在本例中为node)。
神乐十三2020/03/17 18:00:58

的Linux

运行ps并确定节点进程的PID。

然后跑 sudo kill PID

视窗

使用任务列表显示正在运行的进程的列表:

tasklist /O

然后,像这样杀死节点进程(使用从tasklist命令获得的PID ):

taskkill /pid PID
西门前端2020/03/17 18:00:58

这是一个衬板(用端口或配置变量替换3000):

kill $(lsof -t -i:3000)
斯丁蛋蛋2020/03/17 18:00:58

对于Windows,请打开任务管理器并找到node.exe进程。使用“结束任务”杀死所有人。

在此处输入图片说明

西门Davaid2020/03/17 18:00:58

我一次遇到此错误,并在此处采用了许多方法。

我的问题是app.listen(3000);在同一个app.js脚本中有两个调用。第一个app.listen()成功,第二个引发错误。

我遇到的另一个有用的命令是对我有用的调试程序sudo fuser -k 3000/tcp,它将杀死您可能已启动的任何恶意进程(某些进程可能会重新启动,例如,如果使用forever.js运行,但这对我很有用)。

Stafan小宇宙2020/03/17 18:00:58

使用以下命令检查在端口3000上运行的进程的PID(即id):

lsof -i tcp:3000

它将输出如下内容:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

现在使用以下命令终止该进程:

kill -9 5805
神奇飞云2020/03/17 18:00:58

我找到了此解决方案,请尝试使用“授予权限” sudo

  sudo pkill node
小胖Green2020/03/17 18:00:57

您还可以使用命令行路线:

ps aux | grep node

获取进程ID。

然后:

kill -9 PID

杀死-9时会发送SIGKILL(而不是SIGTERM)。有时对我来说,SIGTERM被节点忽略了。

神奇Sam理查德2020/03/17 18:00:57

我在运行win8的笔记本电脑上点击了它。这工作。

以“管理员”身份运行cmd.exe:

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.
JinJin宝儿2020/03/17 18:00:57

首先,您想知道正在使用哪个进程 port 3000

sudo lsof -i :3000

这将列出所有PID此端口上侦听,一旦你有PID,你可以用下面的终止它:

kill -9 {PID}