【问题标题】:Node.js Port 3000 already in use but it actually isn't?Node.js 端口 3000 已经在使用,但实际上不是?
【发布时间】:2017-01-12 07:44:22
【问题描述】:

我已经使用 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 来检查哪个进程正在使用该端口,但没有使用该端口。我也尝试重新启动我的笔记本电脑,但我仍然得到同样的错误。

【问题讨论】:

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

标签: javascript node.js npm port


【解决方案1】:

您可以搜索如何杀死该进程。

对于 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 可以。谢谢。
【解决方案2】:

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

npx kill-port 3000


杀死多个端口。

npx kill-port 3000 8080 4200

【讨论】:

  • npx kill-port 3000 为我工作。谢谢@Penny
  • 我不知道这个包的存在。只有早上 7:30,我的一天已经结束了。
  • 哇...这绝对拯救了我的夜晚
  • 是的,谢谢,但它安装了什么包?
【解决方案3】:

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

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

还有,

sudo lsof -i:<PORT_NO>

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

sudo kill <PID>

有效,但是当我们更新代码并保存时,再次出现此问题,就像 Nodemon 一样。

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

  killall -9 node

【讨论】:

  • lsof 或 netstat 均未返回任何内容,但似乎仍有一些进程在使用该端口。在killall -9 node 之后,我就可以在本地运行服务器了。
  • 感谢 killall -9 node 命令。它在 goorm IDE 上工作
【解决方案4】:

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

  1. 打开任务管理器(按Ctrl+Alt+删除
  2. 选择“进程选项卡”
  3. 搜索“Node.js:服务器端 JavaScript”
  4. 选择它并点击“结束任务”按钮

现在你可以运行npm start

希望对你有帮助。

【讨论】:

    【解决方案5】:

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

    1. 转到任务管理器

    2. 滚动并找到一个名为的任务进程。 Node.js:服务器端 JavaScript

    3. 结束这个特定的任务。

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案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'"
          }
        }
        

        这将导致 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
        【解决方案8】:
         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 找出正在使用该端口的内容
        【解决方案9】:

        我也看到了同样的情况,并尝试了上述所有建议,但均未成功。以下是为我解决它的步骤: - 关闭无线网络 - npm start(这应该可以) - 打开无线网络

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

        【讨论】:

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

        我在 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
        

        # 查看特定端口的命令行

        在 cmd 中:

        $ netstat -ano | find "14228"
        

        在 bash 中:

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

        #使用“tasklist”命令查找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
        

        【讨论】:

        • 你是最伟大的 :-) package.json 中的行:“stop”:“taskkill -f -im node.exe”为我做了。我使用 SSH 远程工作。我不得不寻找一个我认为更多的解决方案。所有的杀戮命令等都不起作用。
        【解决方案11】:

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

        或者,由于复制/粘贴,您可能正在多次监听端口 =)

        【讨论】:

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

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

        【讨论】:

          【解决方案13】:

          如果您只想关闭一个端口,只需运行此命令。 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"
          },
          

          【讨论】:

            【解决方案14】:

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

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

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

            sudo pkill node
            

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

            【讨论】:

              【解决方案15】:

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

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

              【讨论】:

              • 赞成提供帮助的意愿和可能有助于找到根本原因的解决方案。
              【解决方案16】:

              我最近在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启动的
              【解决方案17】:

              来自 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' &gt; /etc/hosts

              【讨论】:

                【解决方案18】:

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

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

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

                谢谢。

                【讨论】:

                  【解决方案19】:

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

                  希望对你有帮助

                  【讨论】:

                    【解决方案20】:

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

                    【讨论】:

                      【解决方案21】:

                      windows用户可以使用CurrPorts工具轻松杀掉正在使用的端口

                      【讨论】:

                        【解决方案22】:

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

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

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



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

                        【讨论】:

                          【解决方案23】:

                          简单的linux

                          • 打开你的终端
                          • 从进程中释放端口 -> 杀死 $(lsof -t -i:$port)

                          【讨论】:

                            【解决方案24】:

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

                            lsof -i:3000
                            

                            但还是会出错

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

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

                            【讨论】:

                            【解决方案25】:

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

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

                            【讨论】:

                            • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
                            【解决方案26】:

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

                            【讨论】:

                              【解决方案27】:

                              如果您使用 webstorm,请确保您的默认端口不是 3000 从 文件 -> 设置 -> 构建、执行、部署 -> 调试器 还有变化

                              内置服务器端口

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

                              【讨论】:

                                【解决方案28】:

                                在 package.json 脚本中包括:

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

                                我认为对我来说问题在于 nodemon 没有及时关闭旧端口以重新启动。我在使用 multer 时遇到了这个问题。

                                【讨论】:

                                • 根据需要调整延迟。
                                【解决方案29】:

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

                                【讨论】:

                                  【解决方案30】:

                                  在我的情况下,我刚刚开始使用 VS Code,并按照使用 Sequelize 的教程进行操作。 最后,我有一个 bin/www 文件,其中包含 listen() 。 我不知道这一点,我通过运行 node app.js 来运行我的应用程序,当它不起作用时,我使用 .listen() 添加了快速服务器的东西(效果很好)。

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

                                  长话短说,我已将 .listen() 添加到我的 app.js 并直接运行 app.js,而我不应该添加它并运行 bin/www。

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 2019-04-08
                                    • 2019-10-28
                                    • 1970-01-01
                                    • 2021-04-09
                                    • 2021-09-27
                                    • 2016-01-17
                                    • 1970-01-01
                                    • 2017-04-01
                                    相关资源
                                    最近更新 更多