错误:侦听EADDRINUSE:地址已在使用中:::3001 [Nodemon,Node.js]

mbskvtky  于 2023-02-15  发布在  Node.js
关注(0)|答案(2)|浏览(438)

我已经使用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

Package.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...

lzfw57am

lzfw57am1#

当Nodemon检测到任何被监控文件的变化时,它会发送一个SIGUSR2信号到加载的应用程序,然后它会在内存中重新生成("重新加载")该应用程序的一个新示例。如果您不处理SIGUSR2信号,那么您的应用程序的旧副本仍然是活的,侦听端口3001(或其他)上的传入请求。
因此,新示例正在启动。它将监听同一个编程端口,即3001。但由于旧副本尚未失效(仍在运行),因此该端口仍在使用,这将导致:
错误:侦听EADDRINUSE:地址已在使用中
简单地说,那就是问题的原因。
解决方案是侦听SIGUSR2信号,并在该事件发生时通过编程方式优雅地关闭应用程序。在代码中的某个位置添加以下代码行,越早越好:

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

现在你的应用程序在看到这个信号时会自动终止,上面的代码可能不能100%工作,但是按照这个模式,你可以监听许多其他的POSIX信号并相应地处理它们,例如SIGINT,SIGABRT,SIGHUP,SIGTERM,等等。
在Nodemon页面上阅读更多关于Nodemon和优雅地重新加载脚本的信息。

umuewwlo

umuewwlo2#

尝试以下任意命令终止该进程。

kill -9 $(lsof -t -i:3001)
npx kill-port 3001

相关问题