Nodemon:错误:侦听 EADDRINUSE:地址已在使用中 :::5000

Ris*_*dey 18 javascript node.js express nodemon

我正在创建一个项目并使用 nodejs,为后端表达。一切正常,但是当我对文件进行任何更改时,由于以下错误,nodemon 无法重新启动服务器:

Error: listen EADDRINUSE: address already in use :::5000

索引.js:

const express = require("express");
const morgan = require("morgan");
const mongoose = require("mongoose");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const FileStore = require("session-file-store")(session);
const dotenv = require("dotenv");
var passport = require("passport");

dotenv.config();

const PORT = process.env.PORT || 5000;

const app = express();

.....

app.listen(PORT, () => console.log(`Server listening on port ${PORT}!`));
Run Code Online (Sandbox Code Playgroud)

包.json

const express = require("express");
const morgan = require("morgan");
const mongoose = require("mongoose");
const cookieParser = require("cookie-parser");
const session = require("express-session");
const FileStore = require("session-file-store")(session);
const dotenv = require("dotenv");
var passport = require("passport");

dotenv.config();

const PORT = process.env.PORT || 5000;

const app = express();

.....

app.listen(PORT, () => console.log(`Server listening on port ${PORT}!`));
Run Code Online (Sandbox Code Playgroud)

我每次都必须从终端明确杀死服务器,这不是最佳解决方案。我尝试了几件事,但都没有奏效。甚至在 nodemon GitHub 问题页面中发现了一些问题,但我也找不到任何东西。

我还添加了lsof -i:5000的输出,即使服务器我正在关闭服务器 - * node 31625 rishav 20u IPv6 5300049 0t0 TCP :5000 (LISTEN)

Jey*_*yov 19

--delay 帮助我解决了这两个问题

我还补充道:

process.once('SIGUSR2', function () {
  process.kill(process.pid, 'SIGUSR2');
});

process.on('SIGINT', function () {
  // this is only called on ctrl+c, not restart
  process.kill(process.pid, 'SIGINT');
});
Run Code Online (Sandbox Code Playgroud)


小智 16

我有同样的情况。如果您使用的是 Visual Studio Code,请检查您的终端。您可能有其他已经在运行您的节点服务器的终端实例。

  • 这就是OP需要的确切答案,因为这对我来说也是同样的情况!谢谢,我忘了检查其他终端实例。 (2认同)

Ndi*_*tah 10

上述所有解决方案都不适合我。我每次都必须这样做:

npx kill-port 5000
Run Code Online (Sandbox Code Playgroud)


Don*_* Wu 8

我遇到了同样的问题,每次保存文件时都会发生错误。

** 更新于 2021 年 3 月 18 日 **

  • 对我来说解决这个问题最快最直接的方法就是重新启动计算机。
  • 我确信即使我重新打开 VS 编辑器,nodemon 仍在某处运行,这会导致地址冲突。
  • 这个问题在我的例子中出现过几次。
  • 我仍在试图找出问题的根源。这不是一个完美的解决方案。

** 结尾 **

我需要退出nodemon模式,找出PID,然后杀死它。这不是一个好的解决方案,因为它很麻烦并且阻止我在终端中获取调试日志。

但我找到了另一种方法来解决问题,只需将文件名更改为server.js另一个名称(例如,我尝试过server1.js),同时更改package.json文件中的脚本。(“server”:) npx nodemon server1.js最后运行npm run server

前: 在此输入图像描述

这是我所做的:

  1. 将文件名从 更改server.jsserver1.js.
  2. 将文件中的脚本package.json从更改"server": "npx nodemon server.js""server": "npx nodemon server1.js".
  3. $ npm run server

后: 在此输入图像描述

我知道这是一个奇怪的解决方案,也许我的计算机或 nodemon 包出了问题,但最终,它确实对我有用,文件名确实很重要。

这是我在 2020 年 11 月 1 日发现的一个有趣的观察结果:

  1. 如果您同时拥有 和 两个文件,server.js并且server1.js它们具有相同的端口号 (8000),则当 时npm run server,会发生错误。
  2. 看来nodemonserver.js默认会自动运行。即使我只"server": "npx nodemon server1.js"在 package.json 中,当我的终端执行npm run server命令时,nodemonserver.js也会server1.js同时运行。
  3. 由于server.jsserver1.js具有相同的端口号,这使得错误发生。
  4. 类似的,如果我们只有server.jsnodemonserver.js自动运行,然后server.js按照package.json脚本运行,就会出现错误。

希望这会有所帮助。请随时告诉我这是否适用于您的应用程序。


小智 8

我认为当我在没有事先关闭 nodemon 的情况下关闭服务器的终端时会发生这个错误。

然后,通常第二天,nodemon 开始表现得很奇怪。

如何解决的:我注意到在运行ps -fp $(grep -u my_username) 时,我启动并运行了几个 nodemon 实例。所以我做了pkill -f nodemon,它杀死了所有的 nodemon 实例,然后重新启动了 nodemon 并且在我的 Linux 服务器的美妙领域中一切都恢复了。

  • 正如 incolas 提到的,运行“pkill -f nodemon”对我有帮助。我一直试图简单地单独杀死该端口,但这只是暂时解决了问题。保存几次后问题就会再次出现... (3认同)

Geo*_*rgy 6

所有答案都建议出于某种原因与 nodemon 修复分开。为了正确重新启动服务器,您需要使用正确的信号将其关闭(终止)。您可以使用标志指定信号--signal。例如:

nodemon --exec go run main.go --signal SIGTERM
Run Code Online (Sandbox Code Playgroud)

在您的特定示例中,这将是:

nodemon --ignore 'sessions/' index.js --signal SIGTERM
Run Code Online (Sandbox Code Playgroud)

更多内容请参见优雅地重新加载脚本


小智 6

一个新的可能原因是,在 macOS Monterey (12.0) 中,默认情况下打开“AirPlay Receiver”(使用端口 5000,并由进程名称表示)ControlCenter。您可以像这样关闭它:

  1. 打开系统偏好设置
  2. 进入“分享”
  3. 取消选中左侧列表底部的“AirPlay 接收器”。

更多详细信息请参见此处

您还可以在不同的端口上运行服务器,例如 3000。


Nir*_*tel 5

您可以尝试在其他端口(如 3000)上运行您的服务器。

如果您仍想使用相同的端口,则可以使用以下命令获取该特定端口上正在运行的进程列表:

lsof -i tcp:3000 
Run Code Online (Sandbox Code Playgroud)

在终端中使用以下命令来终止正在运行的端口

sudo kill -9 $(lsof -i tcp: 3000 -t)
Run Code Online (Sandbox Code Playgroud)


小智 5

sudo pkill node
Run Code Online (Sandbox Code Playgroud)

它将终止所有正在运行的服务器


小智 5

编辑声明应用程序的代码部分,如下所示。

    app.listen(PORT, function () {
    console.log(`The SERVER HAS STARTED ON PORT: ${PORT}`);
  })
  //   Fix the Error EADDRINUSE
  .on("error", function (err) {
    process.once("SIGUSR2", function () {
      process.kill(process.pid, "SIGUSR2");
    });
    process.on("SIGINT", function () {
      // this is only called on ctrl+c, not restart
      process.kill(process.pid, "SIGINT");
    });
  });
Run Code Online (Sandbox Code Playgroud)

轻松的皮兹。这对我有用。感谢:https://www.youtube.com/watch?v =YwP3KJ0lH_k


Fid*_*ide 1

您的端口已在其他地方使用。最有可能的是,您忘记在运行新节点之前停止前一个节点实例。

  • 不是它没有运行,每当我启动nodemon,然后保存文件时,就会发生错误 (2认同)