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个回答

3
我在Windows上使用Git Bash遇到了问题。 我运行npm startnode app.js,然后使用Ctrl+C短暂终止它,并尝试使用npm startnode app.js重新启动服务器,那么我会收到此错误消息。
但是,如果我使用常规的Windows命令提示符,则一切正常。
或者您可以采用另一种方法。 打开任务管理器并找到“Node.js:服务器端JavaScript”一栏。 选择它并终止任务。 应该现在能够正常工作。
谢谢。

2

对于Windows用户,您可以使用CurrPorts工具轻松关闭正在使用的端口。

输入图片说明


2
对于Windows用户,只需在任务管理器中停止所有Node.js进程即可。 希望能帮到您。

2
如果在同一端口多次调用app.listen函数,则可能会出现此错误。您可以检查代码中是否存在任何循环。

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

2
npx kill-port 3000 

然后你可以这样展示:
Need to install the following packages:
kill-port@2.0.1
Ok to proceed? (y)

然后输入: y

1
尝试在浏览器中打开本地主机。只需在地址栏中键入:localhost:3000

如果应用程序打开,这意味着您之前的npm run仍然处于活动状态。现在,您可以更改代码并查看效果,如果您正在设计相同的应用程序,或者如果您想运行另一个应用程序,只需稍微调整代码(在先前运行的应用程序的index.js中),然后(可能刷新浏览器选项卡)使其崩溃;).....现在从新的应用程序目录再次运行npm run start。希望这有所帮助!:)

或者

您可以打开任务管理器(WINDOWS_KEY+X > 任务管理器),然后您会看到“Node.js:服务器端JavaScript”行。选择它并结束任务....现在应该可以工作了!!

如果不行,请更改您的应用程序的.env文件以包括port:3002,然后运行新应用程序。这将允许您在不同的端口上运行两个独立的应用程序。干杯!!

1
在运行 nodemon 之前,请先启动 mongod。这样就不会出现这个错误了。

1

在Linux中很简单

  • 打开终端
  • 释放端口所在的进程 -> kill $(lsof -t -i:$port)

1

我想提及一个尚未被回答的问题。它与Hyper-V(和Docker)“窃取”端口有关:

以下是来自Docker问题(链接如下)的引用:

禁用Hyper-V(这将需要几次重启)。

dism.exe /Online /Disable-Feature:Microsoft-Hyper-V

当您完成所有必需的重新启动后,请保留您想要的端口,以便 Hyper-V 不会将其保留回来。

netsh int ipv4 add excludedportrange protocol=tcp startport=3000 numberofports=1

重新启用 Hyper-V(这将需要几次重启)

dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All

https://github.com/docker/for-win/issues/3171#issuecomment-459205576


0

可能是后台运行的管理员进程,而netstat无法显示此进程。
使用tasklist | grep node查找此管理员进程的PID,然后使用kill PID命令结束该进程。


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