【问题标题】:Error: listen EADDRINUSE: address already in use :::3001 [Nodemon, Node.js]错误:监听 EADDRINUSE:地址已在使用 :::3001 [Nodemon,Node.js]
【发布时间】:2020-10-12 01:12:02
【问题描述】:

我多年来一直使用 Windows 10 笔记本电脑,现在我换成了 MacBook。我从 Github 中提取了一些代码(对我的服务器使用完全相同的代码),Nodemon 不想在我点击保存时自动重新启动服务器。怎么回事?

index.js:

const express = require("express");
const path = require("path");
const cors = require("cors");
const bodyParser = require("body-parser");
const http = require("http");

const app = express();
const server = http.createServer(app);

app.use(express.json({ extended: false, limit: "5mb" }));
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

if (process.env.NODE_ENV === "production") {
    app.use(express.static("client/build"));
    app.get("*", (req, res) =>
        res.sendFile(path.resolve(__dirname, "client", "build", "index.html"))
    );
}

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

server.listen(PORT, () => console.log(`Server started on port ${PORT}.`));

我做了一些更改然后点击保存然后我得到这个错误:

events.js:292
[0]       throw er; // Unhandled 'error' event
[0]       ^
[0] 
[0] Error: listen EADDRINUSE: address already in use :::3001

包.json:

"scripts": {
        "start": "node index.js",
        "server": "nodemon index.js",
        "client": "npm start --prefix client",
        "dev": "concurrently \"npm run server\" \"npm run client\""
},

我想要的是,当我点击保存时,它会保存所有内容,然后在同一端口上重新启动服务器。一切都是自动的。我不想每次保存时都手动终止服务器。这个可以在 Windows 10 上运行,现在它不能在我的 MacBook 上运行......

【问题讨论】:

  • 有时可以,有时不行,我全局安装了nodemon
  • 当我退出时,它给了我 nodemon 130 错误代码
  • 你能告诉我们client目录下package.json的内容吗?
  • 另外你用的是什么node和npm版本?
  • 我认为question 可以解决您的问题

标签: javascript node.js nodemon


【解决方案1】:

当 Nodemon 检测到任何受监视文件中的更改时,它会向已加载的应用程序发送 SIGUSR2 信号,然后它会在内存中重新生成(“重新加载”)该应用程序的新实例。如果您不处理该 SIGUSR2 信号,那么您的应用程序的旧副本仍将处于活动状态,侦听端口 3001(或其他)上的传入请求。

所以新实例正在启动。它将侦听相同的编程端口,即 3001。但由于旧副本尚未失效(仍在运行),因此仍使用该端口,这将导致:

错误:监听 EADDRINUSE:地址已在使用中

简而言之,这就是问题的原因。

解决方案是侦听该 SIGUSR2 信号,并在该事件发生时以编程方式正常关闭您的应用程序。在代码的某处添加以下行,越早越好:

process.once("SIGUSR2", () => server.close(err => process.kill(process.pid, "SIGUSR2")));

现在您的应用程序将在看到该信号时自行终止。上面的代码可能无法 100% 工作,但按照这种模式,我们可以监听许多其他 POSIX 信号并相应地处理它们,例如 SIGINT、SIGABRT、SIGHUP、SIGTERM 等。Read more

Nodemon page 上阅读有关 Nodemon 和优雅地重新加载脚本的更多信息。

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 2021-07-21
    • 2021-02-11
    • 2020-11-09
    • 2020-04-08
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多