Node.js端口号3000已被占用,但实际上并没有被占用?

385

我已经在一个node.js项目上工作了几周,一切进展顺利。通常,我使用npm start来运行我的应用程序,并在本地主机上的浏览器中查看它,端口为3000。

今天,在使用npm start时,我开始遇到以下错误:

Server started on port 3000                                                                                                                                                                                         
Port 3000 is already in use 

我已经检查了资源监视器,没有其他进程在端口3000上运行。为什么会出现这个错误信息?

在我的app.js中,我有以下代码来设置端口...这是否不正确?之前它运行得很好,所以我不确定我做错了什么。

// Set Port
app.set('port', (process.env.PORT || 3000));
app.listen(app.get('port'), function() {
    console.log('Server started on port '+app.get('port'));
});

感谢您的帮助!


编辑:

我已经尝试运行netstat和TCPView来检查使用该端口的进程,但没有任何东西在使用该端口。我还尝试重新启动我的笔记本电脑,但仍然遇到相同的错误。


1
你尝试过访问 https://dev59.com/nXVD5IYBdhLWcg3wOo5h 吗? - Isaac
1
网站图标将被缓存。您也可以尝试在命令提示符中使用 netstat,或者使用类似于 PuTTY 的 telnet 等价物连接到 localhost:3000。 - Blorgbeard
7
我注意到你在“服务器已经启动在端口3000上”之后收到了“端口3000已经被占用”的消息 - 你的应用程序中是否有尝试再次在同一端口上开始监听的操作? - Blorgbeard
10
我猜测你的应用程序中有两个 app.listen() 语句,再加上另一个 .listen() 也试图在同一端口启动服务器。第一个运行成功,而第二个会报错。请搜索你的代码中是否存在 .listen - jfriend00
对我来说,问题出在我的 .env 文件上 - 所以请确保其中没有语法错误。 - SMEETT
显示剩余10条评论
46个回答

10

我也遇到过同样的问题并尝试了以上所有建议但都没有成功。以下是解决方法: - 关闭wifi - 运行npm start命令(应该会成功) - 打开wifi

我不太确定原始问题是什么,但这对我有用。


我也遇到了这个问题。netstat -ano 没有列出任何使用 3000 端口的内容。 - Nathan
1
天啊,这个方法对我也起作用了,显然没有任何东西在3000端口上运行。我在Windows更新后开始遇到这个问题。从来没有想过关闭WiFi。谢谢你解决了这个问题 :) - 3Dos
对我来说这很有帮助。我在一天中的某个时候打开了WiFi。我通常使用以太网。所以我完全切断了WiFi,然后重新启动它。一切都恢复正常了。哇。如果没有你的提示,我可能会浪费几个小时。 - shailesh gavathe
这个方法对我也奏效了。之后我尝试了打开WiFi并关闭VPN......同样有效。有人知道为什么会这样吗? - Matthew

8

enter image description here

打开命令提示符,首先运行此命令:

netstat -ano | findstr :7001

然后运行这个命令:

taskkill /PID 2820 /F

6

当没有任务与命令列表一起列出时,它会发生

lsof -i:3000

然而,您仍然会收到错误提示

Error: listen EADDRINUSE: address already in use 0.0.0.0:3000

原因之一是在Nginx的conf.d检查中,没有任何配置侦听3000端口


这并不能解决用户的问题或帮助解决它,请查看如何撰写好的答案 - Voxlinou

6

虽然这是一个老问题,但似乎没有任何回答者真正阅读它。我曾经遇到过同样的问题,而问题在于Windows有时会保留一些端口块并阻止你使用它们。该端口不会出现在netstat或任何其他工具中。您可以在此处阅读有关此问题的更多信息

基本上,您可以通过以下方式告诉Windows不要干扰您的端口:

netsh int ipv4 add excludedportrange tcp startport=3000 numberofports=1 store=persistent

2
非常感谢。这解决了我的问题。我已经尝试寻找解决方案几个小时了。 - TomDom
2
在尝试了之前所有的解决方案后,我到这里来了。在端口3000上没有可见的进程正在运行。这个解决方案对我有用。谢谢。 - Towerss
谢谢!将它与以下命令结合使用后,它可以正常工作: net stop winnat - Frederic Eid

5

打开任务管理器(按Ctrl+Alt+Del) 选择“进程”选项卡 查找“Node.js: Server-side JavaScript” 选择它,然后单击“结束任务”按钮


5

有时候我会遇到“EADDR in use”的问题。通常情况下,这是因为后台仍在运行应用程序的终端窗口。您可以在终端窗口中使用ctrl+C来停止该进程。

或者,也许是由于复制/粘贴而多次监听同一个端口 =)


谢谢你的帮助!我没有打开其他终端窗口,还有什么其他需要检查的吗? - user2573690
找到任何节点或npm进程并结束它。如果仍然有问题,请重新启动机器,或选择不同的端口进行工作。实际上,没有必要使用端口3000或8080,没有任何理由一定要使用这些端口。 - sova
2
谢谢!我成功地解决了问题,原来是由于多次监听端口,复制/粘贴错误导致的!如果您可以编辑您的答案并添加这一部分,我会标记它的。再次感谢! - user2573690
这里有一个奇怪的问题:我在GitBash中使用Ctrl+C (^C)退出了进程,但当我再次启动服务器——npm start——时,我会收到EADDR正在使用的错误。当我刷新浏览器时,我看到所有的GET日志表明线程仍在运行。如果我很幸运,关闭所有GitBash实例并等待一分钟似乎可以解决问题,尽管这是一个痛苦的过程,需要关闭多个git项目/服务器上的不同实例。 - Cody
我刚刚做了一个实验:我关闭了我的服务器(使用 Ctrl+C),然后等待了大约关闭所有 GitBash 实例所需的相同时间,再次启动服务器——这似乎有所改善。希望这能为您节省时间。 - Cody
显示剩余2条评论

5
我最近在win10上遇到了一个奇怪的端口问题,无法启动服务器进程监听8080端口,将其更改为18080后就可以工作,但过一会儿后,同样的问题又出现了。但我找不到使用该端口的任何进程,我尝试使用currpots和netstat,但它们都没有起作用,我尝试打开端口。
python -m http.server 18080
python -m http.server 18081
python -m http.server 18082
python -m http.server 18083
python -m http.server 18084
...

大多数情况下会出现“端口已被使用”的类似信息。幸运的是,我进行了搜索并找到了原因。通过

netsh interface ipv4 show excludedportrange protocol=tcp

一些端口被排除使用,通过这些未开放和监听的端口。

net stop winnat

大多数被排除的端口已经被释放,这些端口现在可以使用。


"net stop winnat" - 我刚刚忘记了那个命令。几周前和今天因为同样的问题需要用到它(有时候会出现...为什么?!)。我会将其添加到自启动中。 - Xairoo
似乎 winnat 服务是由 Windows Hyper-V 启动的。 - towith

4
我花了2小时找出为什么 EADDRINUSE 不允许我启动应用程序(其他node-express服务器可以正常运行)... 在数据源配置中添加 lazyConnect: true, 后它开始工作了。
不要问我为什么这样有帮助,我不知道。我在这里提供这些信息只是为了有同样问题的人们。

因为愿意提供帮助并且给出可能有助于找到根本原因的解决方案而获得了赞同。 - Titou
抱歉,请问设置在哪里? - May'Habit

4

通过谷歌搜索,我找到了一个High Sierra的解决方案。

macOS的网络设置发生了一些变化,一些应用程序(包括ping)无法解析localhost。

编辑/etc/hosts似乎是一个解决方法:

命令:sudo nano /etc/hosts/ 内容:127.0.0.1 localhost

或者简单地(如果您确定您的/etc/hosts是空的) sudo echo '127.0.0.1 localhost' > /etc/hosts


4
如果你想关闭一个端口,只需运行以下命令:kill -9 $(lsof -t -i:3000) pkillkill之间的区别在于某些进程被击中。在kill中你需要应用过滤器,只停止你想要的端口。 pkill命令关闭所有node进程。pkill -9 node 使用pkill来避免开发过程中偶尔出现的内存泄漏问题。如果有多个node,则全部关闭。
还举例说明了在package.json中使用脚本的用法。
"scripts": {
    "server:start": "cd server && yarn start",
    "server:restart": "cd server && yarn restart",
    "frontend:start": "cd frontend && yarn start",
    "frontend:restart": "kill -9 $(lsof -t -i:4200) && yarn start:frontend"
},

"scripts": {
    "start": "nodemon --watch 'src/**/*.ts' --ignore 'src/**/*.spec.ts' --exec 'ts-node' src/index.ts",
    "restart": "pkill -9 node && start",
    "kill": "pkill -9 node"
},

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接