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


114

我已经在一个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来检查正在使用该端口的进程,但是没有使用该端口的东西。我也尝试过重新启动笔记本电脑,但仍然出现相同的错误。


可以肯定,还有另一个使用此端口的进程。您要尝试哪一个?你可以谷歌像“找到这prosess使用端口”为您的操作系统
tanaydin


1
该图标将被缓存。您也可以netstat在命令提示符下尝试,或使用等效的telnet-PuTTY连接到localhost:3000。
Blorgbeard在

5
我注意到 “服务器在端口3000上启动” 之后,您得到“端口3000已在使用中” -您的应用程序中是否有某些东西试图再次在同一端口上开始侦听?
Blorgbeard在

6
我的猜测是app.listen()您的应用程序中有两个语句,另一个.listen()也在尝试在该端口上启动服务器。第一个起作用,第二个报告错误。在您的代码中搜索.listen
jfriend00

Answers:


269

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

对于Linux / Mac OS (sudo) run,请在终端中进行搜索:

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

在Windows上:

netstat -ano | findstr :3000
tskill typeyourPIDhere 

更改tskilltaskkillGit中的bash


2
我在Windows上尝试了许多其他解决方案,但是这个发现了困扰端口的奇怪过程。除了在Windows上工作外,还包括linux方法而赢得赞誉。
truedat101

2
tskill在Windows上不为我工作。taskkill / F / PID myPIDhere-此工作
snersesyan

2
我一无所获,lsof而一无所获sudo lsof ,消除这一过程解决了这个问题。
user985366

有没有一种方法可以动态获取正在运行的进程的PID并杀死它?由于某些原因,每次我手动部署到产品时都必须这样做。旁注,请确保这是否与PM2相关。
S_W

taskkill在git-bash上不适合我,但是tskill可以。谢谢。
尼克卡米洛

34

有时它会发生,如@sova所建议的有时我会发生这种情况,即使用了EADDR。通常,有一个终端窗口隐藏在后台,但仍在运行该应用程序。我也是对的。

碰巧的是,当您长时间打开终端时,是的,您没有错,但您已经停止了该过程。但是有时它并没有在后台停止。最好的解决方案是关闭终端,然后重新启动。它将解决您的问题。因为就我而言,它有效。

也,

sudo lsof -i:<PORT_NO>

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

sudo kill <PID>

可以,但是再次更新代码并保存时,与Nodemon一样再次发生此问题。

因此退出终端将解决问题。要么

  killall -9 node

2
lsof或netstat均未返回任何内容,但似乎仍在使用该端口进行某些处理。在killall -9 node我能够本地运行服务器之后。
Julsteri '18

感谢killall -9 node命令。它适用于goorm IDE
ifhy

24

也许您可以以此为参考。这条命令行可以终止在给定端口上运行的进程。

npx kill-port 3000

在此处输入图片说明


杀死多个端口。

npx kill-port 3000 8080 4200

22

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


22

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

  1. 打开任务管理器(按Ctrl+ Alt+ Delete
  2. 选择“流程”标签
  3. 搜索“ Node.js:服务器端JavaScript”
  4. 选择它,然后单击“结束任务”按钮

现在您可以运行npm start

希望对您有帮助。


7

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

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


我也发生了这种情况。 netstat -ano没有使用端口3000列出任何内容。–
Nathan

天哪,这也为我解决了问题,因为显然端口3000上没有任何运行。Windows更新后,我开始遇到此问题。从来没有想过关闭WiFi。感谢您解决此问题:)
3Dos

7

杀死拥有端口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'"
  }
}

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

或者你可以尝试这个

fuser -k PORT-NO/tcp

例如:

fuser -k 3000/tcp

这是杀死进程的一个很好的,干净的解决方案。每次都要看如何做,这是我见过的最好的解决方案!
twknab

尽管没有进程从lsof -i :3000 -t= \ 返回,但我正在遇到此问题
xaunlopez

@xaunlopez尝试这个 fuser -k port-number/tcp
Afeesudheen

6

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

$ 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命令和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

#用于查看特定端口的命令行

在cmd中:

$ netstat -ano | find "14228"

在bash中:

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

#使用“任务列表”命令查找node.exe

在cmd中:

$ 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

5

有时我会遇到这种情况,正在使用EADDR。通常,有一个终端窗口隐藏在后台,但仍在运行该应用程序。您可以在终端窗口中使用ctrl + C停止进程。

或者,也许由于copy / pasta =)您正在多次监听端口


谢谢您的帮助!我没有打开任何其他终端窗口,还有其他应检查的内容吗?
user2573690

找到任何节点或npm进程并结束它。如果您仍然有放克,重新启动计算机,或者只是选择其他端口来使用。确实没有理由必须是端口3000或8080
sova

我刚刚创建了一个新的节点应用程序,并在端口3000上启动了该应用程序,它似乎运行良好,但是当我尝试运行现有项目时,它表示该端口正在使用中。您遇到过这个问题吗?
user2573690

@ user2573690我以前没有遇到过,但是也许您有多个js文件(例如app.js和index.js),其中一个文件被调用.listen()多次?
萨瓦

2
谢谢!我设法弄清楚了,我多次收听该端口,发生复制/意大利面事故!如果您可以编辑答案并添加该内容,则将其标记出来。再次谢谢你!
user2573690


2

从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


2

我花了2个小时来找出为什么EADDRINUSE不允许我销售应用程序(其他节点表达服务器都可以)的过程……添加 lazyConnect: true, 到数据源配置后它开始工作 。

不要问我为什么有帮助。我不知道。我将此信息仅用于具有相同问题的人。


表示愿意提供帮助,并提出可能有助于找到根本原因的解决方案。
蒂头

2

我在Windows上使用Git Bash遇到了这个问题。我跑步npm startnode app.js。在不久之后使用Ctrl + C终止它并尝试使用npm start或重新启动服务器node app.js后,我得到了此错误消息。

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

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

谢谢。


2

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

pkill和之间的区别kill是有人处理黏土。要杀死您,请应用过滤器。您只需停止想要的端口即可。

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

1

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

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

要么

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



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




1

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

  1. 转到任务管理器

  2. 滚动并找到一个名为的任务进程。 Node.js:服务器端JavaScript 图片已添加以供参考

  3. 结束此特定任务。

你去!现在执行npm start,它将像以前一样工作!



0

它可能是在后台运行的管理进程,netstat但未显示该进程。
使用tasklist | grep node找到这个管理进程的PID,然后kill PID



0

在package.json脚本中包括:

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

我认为问题对我而言是旧端口未由nodemon及时关闭以进行重新启动的时间。我在使用multer时遇到了问题。


根据需要调整延迟。
Kalkhas

0

服务器或应用程序的listen()方法可能会在2个地方添加。在应用程序启动中搜索listen()方法,这就是为什么它作为服务器返回在端口XXXX和端口XXXX已开始使用的消息并排出现的原因


0

在我的情况下,我刚开始使用VS Code,并遵循了使用Sequelize的教程。最后,我有一个bin / www文件,其中包含listen()。我对此一无所知,我通过运行node app.js来运行我的应用程序,当它不起作用时,我使用.listen()添加了Express Server的东西(效果很好)。

但是,当开始使用nodemon和VSCode时,它指向bin / www,这需要我的app.js。

长话短说,我已经将.listen()添加到我的app.js中,并且当我不应该添加.listen()并运行bin / www时直接运行了app.js。


0

在ubuntu中,首先使用端口号获取进程:sudo lsof -i:3000,然后使用kill命令终止该进程,例如,如果进程PID为4493,则使用use命令:kill 4493,对于Mac或Windows,请找到相关命令

在此处输入图片说明


0

我已经解决了这个问题,因为MongoDB或您之前在此端口上运行过另一个应用程序,因此要解决它,它会杀死任务管理器中的进程,或者只是将端口号从3000更改为其他端口。


0

非常简单 您可以通过2个简单的步骤对其进行修复。

  1. 检查环境变量是否存在名称为“ PORT”的键/条目。
  2. 如果找到,则删除该条目或将其重命名为其他名称。

事实证明,其他一些程序正在使用该变量。通常,当您启动react-scripts时,它将查找标题为PORT的环境变量。


-1

在运行nodemon之前,请先启动mongod。您将永远不会收到此错误。:)


-2

通过输入以下命令来检查在同一端口上运行的任何进程:

sudo ps -ef

您可以找到在相应节点端口上运行的进程,然后通过以下方法杀死该节点:

kill -9 <node id>

如果问题仍然存在,则杀死所有节点

killall node

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.