ChatGPT解决这个技术问题 Extra ChatGPT

Node.js 端口 3000 已经在使用,但实际上不是?

我已经使用 node.js 项目工作了几个星期,它一直运行良好。通常,我使用 npm start 运行我的应用程序并在 localhost 端口 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 来检查哪个进程正在使用该端口,但没有使用该端口。我也尝试重新启动我的笔记本电脑,但我仍然得到同样的错误。

有另一个进程使用这个端口,这是肯定的。您要尝试哪个操作系统?您可以像“查找哪个程序使用端口”一样为您的操作系统搜索它
网站图标将被缓存。您还可以在命令提示符下尝试 netstat,或者使用 telnet 等效项(例如 PuTTY)连接到 localhost:3000。
我注意到您在“服务器在端口 3000 上启动”之后收到“端口 3000 已在使用中”——您的应用程序中是否有某些东西试图在同一个端口上再次开始监听?
我的猜测是,您的应用中有两个 app.listen() 语句,另一个 .listen() 也试图在该端口上启动服务器。第一个有效,第二个报告错误。在您的代码中搜索 .listen

A
Ashwani Panwar

您可以搜索如何终止该进程。

对于 Linux/Mac 操作系统,在终端中搜索 (sudo) run

$ lsof -i tcp:3000
$ kill -9 PID

在 Windows 上:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

在 git bash 中将 tskill 更改为 taskkill


我在 Windows 上尝试了许多其他解决方案,但是这个发现了占用端口的奇怪进程。除了在 Windows 上工作之外,还因为包括 linux 方法而获得赞誉。
tskill 在 Windows 上对我不起作用。 taskkill /F /PID myPIDhere - 这个工作
我只用 lsof 什么都得不到,但用 sudo lsof 我得到了一些东西,杀死那个进程解决了这个问题。
有没有办法动态获取正在运行的进程的PID并杀死它?出于某种原因,我每次手动部署到 prod 时都必须这样做。旁注,确定这是否与 PM2 有关。
taskkill 在 git-bash 上对我不起作用,但 tskill 可以。谢谢。
P
Penny Liu

也许你可以以此作为参考。这个单一的命令行可以杀死在给定端口上运行的进程。

npx kill-port 3000

https://i.stack.imgur.com/uqjmN.png

杀死多个端口。

npx kill-port 3000 8080 4200

npx kill-port 3000 为我工作。谢谢@Penny
我不知道这个包存在。只有早上 7:30,我的一天已经结束了。
哇...这绝对拯救了我的夜晚
是的,谢谢,但是它安装了什么包?
惊人的!工作得很好。我喜欢简单的解决方案。
A
Abhay

有时它会发生,正如@sova 建议的那样这有时会发生在我身上,正在使用 EADDR。通常有一个终端窗口隐藏在后台仍在运行应用程序。这对我来说也是正确的。

发生这种情况时,当您长时间打开终端时,是的,您是对的,您已经停止了该过程。但有时它并没有在后台停止。所以最好的解决方案是关闭终端并重新启动它。它将解决您的问题。因为在我的情况下它有效。

还,

sudo lsof -i:<PORT_NO>

暂时关闭实例,但无法在后台停止进程。所以有一次,

sudo kill <PID>

可以,但是当我们更新代码并保存时,再次出现这个问题,就像 Nodemon 一样。

所以退出终端就可以解决问题了。或者

  killall -9 node

lsof 或 netstat 都没有返回任何内容,但似乎仍有一些进程在使用该端口。在 killall -9 node 之后,我能够在本地运行服务器。
感谢 killall -9 node 命令。它在 goorm IDE 上工作
killall -9 node 成功了。谢谢!
M
Mahyar

我有同样的问题。 (以下步骤在 Windows 10 上运行良好):

打开任务管理器(按 Ctrl+Alt+Delete)选择“进程选项卡”搜索“Node.js:服务器端 JavaScript”选择它并单击“结束任务”按钮

现在您可以运行 npm start

希望它可以帮助你。


i
i_am_daim

我也遇到了同样的问题。解决的最佳方法是(对于 Windows):

转到任务管理器。滚动并找到一个名为的任务流程。 Node.js:服务器端 JavaScript 结束这个特定任务。

给你!现在做 npm start ,它会像以前一样工作!


P
PRAKASH THOMAS VARGHESE

对于 Windows,任务管理器肯定会显示正在运行的节点进程。尝试杀死该进程,它将解决问题。


A
Afeesudheen

杀死拥有端口 3000 的进程

首先,让我们看看如何杀死一个打开了端口的进程。

使用 lsof 命令,我们可以检索具有给定端口的 PID:

$ lsof -i :3000 -t
12345

然后我们可以通过这样做来终止这个进程:

$ kill 12345

让我们把它变成一个单行:

lsof -i 3000 -t | xargs kill

如果您使用环境变量来设置服务器端口,我们可以指定它而不是硬编码我们的值:

lsof -i ${PORT} -t | xargs kill

最后,如果未设置环境变量,我们可以默认使用端口 3000:

lsof -i ${PORT:-3000} -t | xargs kill

让 nodemon 执行钩子

Nodemon 允许您通过 nodemon.json 配置文件设置事件挂钩:

{
  "events": {
    "crash": "sh -c 'lsof -i :${PORT:-3000} -t | xargs kill'"
  }
}

这将导致 nodemon 在您的应用程序崩溃时执行 sh -c 'lsof -i :${PORT:-3000} -t | xargs kill 命令,从而杀死它产生的保持端口打开的子进程。

或者你可以试试这个

fuser -k PORT-NO/tcp

例如:

fuser -k 3000/tcp

你也可以试试这个

fuser -n tcp -k PORT-NO

例如:

fuser -n tcp -k 3000

这是杀死进程的非常好的和干净的解决方案。每次都必须看看如何做到这一点,这是我见过的最好的解决方案!
我遇到了这个问题,虽然没有从 lsof -i :3000 -t 返回的进程 =\
@xaunlopez 试试这个fuser -k port-number/tcp
S
Salah Ben Bouzid
 killall -9 node

上面的命令可以在您远程开发时退出 vs code ssh 连接并杀死所有可能导致问题的节点进程,特别是如果您有一些使用节点的生产应用程序,有一个更好的方法是使用 netstat 获取所有节点使用他们正在使用的端口进行进程,然后通过 PID 杀死你想要的唯一一个

 netstat -lntp | grep node

您将获得所有节点进程

 tcp6  0      0 :::5744    :::*    LISTEN     3864/node

然后当你得到 PID (3864) 时,只需按 PID 杀死进程

   kill -9 PID

或者

   kill -HUP PID 

我在 Ubuntu 上遇到了同样的错误,所以对我有帮助的是 1)确保您尚未将端口分配给变量,并且仍在使用引号(“端口”)来获取端口连接而不是变量。其次,在 Ubuntu 上,您可以使用 Run sudo netstat -lp 找出正在使用该端口的内容
a
aygunyilmaz

我在 NodeJS 上使用带有 nodemon 的 express 服务器。我收到以下消息,这似乎是一个错误:

$ node ./bin/www
Port 3000 is already in use

有一个通用的解决方案,如果你终止所有节点服务器连接,你可以在你的 package.json 文件中添加这个代码:

"scripts": {
    "start": "node ./bin/www",
    "stop": "taskkill -f -im node.exe"
},

此外,我在 Win 10 x64 上找到了几个解决方案 windows command 和 bash。

我所有的笔记都在这里:

# 终止所有 NodeJS 服务器连接

$ taskkill -f -im node.exe
SUCCESS: The process "node.exe" with PID 14380 has been terminated.
SUCCESS: The process "node.exe" with PID 18364 has been terminated.
SUCCESS: The process "node.exe" with PID 18656 has been terminated.

示例:打开 Windows 任务管理器,查看 Windows 上的“node.exe”PID 号

>> Command Line
$ netstat /?
$ netstat -a -n -o
$ netstat -ano

按端口号杀死 Windows 中的进程(示例)

求助:

$ taskkill /?
$ tskill /?

代码 1:

$ taskkill -pid 14228
ERROR: The process with PID 14228 could not be terminated.
Reason: This process can only be terminated forcefully (with /F option).

代码 2:

$ taskkill -f -pid 14228
SUCCESS: The process with PID 14228 has been terminated.

代码 3:

$ tskill 14228

# 查看特定端口的命令行

在命令中:

$ netstat -ano | find "14228"

在 bash 中:

$ netstat -ano | grep "14228" or $ netstat -ano | grep 14228

# 使用“tasklist”命令查找node.exe

在命令中:

$ tasklist | find "node"

在 bash 中:

$ tasklist | grep node
$ tasklist | grep node.exe
node.exe                     14228 Console                    2     48,156 K
node.exe                     15236 Console                    2     24,776 K
node.exe                     19364 Console                    2     24,428 K

你是最伟大的 :-) package.json 中的行:“stop”:“taskkill -f -im node.exe”为我做了。我使用 SSH 远程工作。我不得不寻找一个我认为更多的解决方案。所有的杀戮命令等都不起作用。
我正在使用 netstat -ano | find "14228" 并希望将其与 taskkill /PID xxx 一起使用。我无法使用 |> 来管道它。它以错误的格式错误向我抛出。我错过了什么?它们是两个:netstat -ano | find "14228" | taskkill /PID xxxnetstat -ano | find "14228" > taskkill /PID xxx。我试过这个netstat -ano | find "14228" | ( set /P var= && set var ) > taskkill /PID ........
J
James Smith

我见过同样的事情,并尝试了上面的所有建议,但没有成功。以下是为我解决问题的步骤: - 关闭 wifi - npm start(这应该可以) - 打开 wifi

我不确定根本问题是什么,但这为我解决了。


我也遇到过这种情况。 netstat -ano 没有列出使用端口 3000 的任何内容。
天哪,这也为我解决了这个问题,因为显然端口 3000 上没有运行任何东西。我在 Windows 更新后开始遇到这个问题。从来没有想过关闭WiFi。谢谢你解决这个问题:)
对我来说这有帮助。我在一天中的某个时候打开了 wifi。我通常使用以太网。所以我完全切断了wifi,然后重新启动它。一切都重新开始工作。哇。如果没有你的暗示,我可能会想好几个小时。
这对我也有用。然后我尝试打开 WiFi 并关闭 VPN ......也有效。有谁知道这可能是为什么?
M
Mayur

自从我找到解决方案以来,我今天面临同样的问题。

问题是因为即使 nodemon 重新启动,也有节点服务在后台运行。

我经历了很多答案,但都带有多个命令。我为我的案例找到了一个简单的命令

sudo pkill node

这将终止节点中所有正在运行的进程,并且您的 nodemon 将按预期开始工作。


s
sova

这有时会发生在我身上,正在使用 EADDR。通常有一个终端窗口隐藏在后台仍在运行应用程序。您可以在终端窗口中使用 ctrl+C 停止进程。

或者,由于复制/意大利面,您可能正在多次监听端口 =)


谢谢您的帮助!我没有打开任何其他终端窗口,还有什么我应该检查的吗?
找到任何节点或 npm 进程并结束它。如果您仍然有问题,请重新启动机器,或者只是选择一个不同的端口来使用。真的没有理由必须是端口 3000 或 8080
我刚刚创建了一个新的节点应用程序并在端口 3000 上启动它,那个似乎工作正常,但是当我尝试运行我现有的项目时,它说端口正在使用中。你有过这个问题吗?
@user2573690 我以前没有遇到过,但也许你有多个 js 文件(如 app.js 和 index.js),其中一个调用 .listen() 多次?
谢谢!我设法弄清楚了,我多次监听端口,复制/意大利面事故!如果您可以编辑您的答案并添加该部分,我会标记它。再次谢谢你!
O
Omar bakhsh

打开任务管理器(按 Ctrl+Alt+Del 选择“进程选项卡”搜索“Node.js:服务器端 JavaScript”选择它并单击“结束任务”按钮


t
test30

我花了 2 小时找出为什么 EADDRINUSE 不允许我启动应用程序(其他 node-express 服务器还可以)...在将 lazyConnect: true, 添加到数据源配置后它开始工作。

不要问我为什么有帮助。我不知道。我把这些信息放在这里只是为了有同样问题的人。


赞成提供帮助的意愿和可能有助于找到根本原因的解决方案。
对不起,设置放在哪里?
u
umutyerebakmaz

如果您只想关闭一个端口,只需运行此命令。 kill -9 $(lsof -t -i:3000)

pkillkill 之间的区别在于有人加工粘土。在杀死你应用过滤器。你只需停止你想要的端口。

pkill 命令关闭所有节点进程。 pkill -9 node

使用 pkill 避免在开发过程中偶尔发生的内存泄漏。如果有多个节点,它会杀死所有节点。

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"
},

t
towith

我最近在win10上遇到了一个奇怪的port problem,无法启动服务器进程监听8080端口,我把它改成18080,然后它就可以了,但是过了一会儿,同样的问题又出现了。但是我找不到任何进程使用该端口,我尝试过 currpotsnetstat ,它们都不起作用,我尝试通过打开端口

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 - 我只是忘记了那个命令。由于同样的问题,几周前和今天需要它(有时会出现......为什么?!)。将其添加到自动启动中。
似乎 winnat 服务是由 windows hyper-v 启动的
o
obrienk

这是一个古老的问题,但似乎没有一个响应者真正阅读过它。我遇到了同样的问题,问题是 Windows 有时会保留端口块并阻止您使用它们。该端口不会通过 netstat 或任何其他工具显示。 You can read about it here

从本质上讲,您可以告诉 Windows 让您的端口单独使用:

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

非常感谢。这解决了我的问题。在过去的几个小时里,我一直在努力寻找解决方案。
在尝试了所有以前的解决方案之后,我来到了这里。端口 3000 上没有可见的进程运行。这个解决方案对我有用。谢谢你。
I
Imran Khan

当命令没有列出任何任务时会发生这种情况

lsof -i:3000

仍然,你得到一个错误

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

一个原因是在 Nginx conf.d 中检查没有配置正在侦听端口 3000


这不能解决用户的问题或帮助解决问题,请查看 how to write a good answer
A
Amanullah Aman

我在 Windows 上使用 Git Bash 遇到了这个问题。我运行 npm startnode app.js。在不久之后使用 Ctrl+C 终止它并尝试使用 npm startnode app.js 再次启动服务器后,我收到此错误消息。

但是,当我使用常规的 Windows 命令提示符执行此操作时,它可以正常工作。

或者你可以用另一种方式来做。打开任务管理器并找到“Node.js:Server-side JavaScript”行。选择那个并结束任务。它现在应该可以工作了。

谢谢。


i
isherwood

https://i.stack.imgur.com/1hOsY.png

打开命令提示符并首先运行以下命令:

netstat -ano | findstr :7001

然后运行这个命令:

taskkill /PID 2820 /F

s
sznowicki

来自 Google 的这里有针对 High Sierra 的解决方案。

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

编辑 /etc/hosts 似乎是一个修复:

cmd:sudo nano /etc/hosts/ 内容 127.0.0.1 localhost

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


Z
Zuhair Taha

对于windows用户,您可以使用CurrPorts工具轻松杀死正在使用的端口

https://i.stack.imgur.com/LldYw.png


M
Muhammad Ashfaq

对于 windows 用户,只需在任务管理器中简单地停止 Node.js 的所有进程

希望它会有所帮助


S
Servet

如果你在同一个端口上多次调用 app.listen 函数,你会得到这个错误。

您可以检查您的代码是否有任何循环


您的答案可以通过额外的支持信息得到改进。请edit添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以找到有关如何写出好答案的更多信息in the help center
M
Mohit Singh

尝试在浏览器中打开 localhost。只需在地址栏中输入:localhost:3000

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

或者

您可以打开任务管理器(WINDOWS_KEY+X > 任务管理器),您将看到“Node.js:Server-side JavaScript”行。选择那个并结束任务....它现在应该可以工作了!



如果没有,请将应用程序的 .env 文件更改为包含 port:3002 并运行新应用程序。这将允许您在不同的端口上运行两个单独的应用程序。干杯!!


O
Oben Desmond

简单的linux

打开你的终端

从进程中释放端口-> kill $(lsof -t -i:$port)


P
Penny Liu

在运行 nodemon 之前,请先启动 mongod。你永远不会得到这个错误。


t
tnoel999888

它可能是在后台运行的管理进程,而 netstat 没有显示这一点。
使用 tasklist | grep node 查找此管理进程的 PID,然后使用 kill PID


M
Muhammad Saleh

如果您使用的是 webstorm,请确保您的默认端口不是 3000,来自文件 -> 设置 -> 构建、执行、部署 -> 调试器,然后更改

内置服务器端口

并将其设置为“63342”或查看此答案Change WebStorm LiveEdit Port (63342)


K
Kalkhas

在 package.json 脚本中包括:

"start": "nodemon app.js --delay 1500ms"

我相信对我而言,问题在于 nodemon 没有及时关闭旧端口以重新启动。我使用 multer 遇到了这个问题。


根据需要调整延迟。