我正在尝试为 expressjs 服务器创建一些设置和拆卸逻辑。这是我的进入代码:
import fs from "fs";
import express from "express";
import { setRoutes } from "./routes";
let app = express();
const server = app.listen(8080, function () {
console.log(` Mock Server is now running on port : ${8080}`);
});
app = setRoutes(app);
function stop() {
fs.rmdirSync("./uploads", { recursive: true });
fs.mkdirSync("uploads");
console.log("\n Uploads folder purged");
server.on("close", function () {
console.log("⬇ Shutting down server");
process.exit();
});
server.close();
}
process.on("SIGINT", stop);
// Purge sw images on restart
process.once("SIGUSR2", function () {
fs.rmdirSync("./uploads/swimages", { recursive: true });
console.log(" Software Images folder purged");
process.kill(process.pid, "SIGUSR2");
});
启动它的 npm 脚本是"start": "FORCE_COLOR=3 nodemon index.js --exec babel-node"
.
设置和重启逻辑按预期工作。我 Mock Server is now running on port : 8080
在启动时登录到控制台。当我保存文件时,nodemon 重新启动服务器,并process.once
执行其中的代码。当我想将它全部关闭时,我ctrl + c
在终端中。stop
运行函数内的清理逻辑。但是,进程会完全退出。在终端中,我仍然卡在进程中,我必须ctrl + c
再次点击才能完全退出进程。它看起来像这样:
据我所知,没有打开的连接(其他问题提到,如果keep-alive
连接仍然打开,服务器将无法正常关闭,但据我所知,情况并非如此)。我尝试了server.close(callback)
, server.on('close', callback)
, process.exit()
,process.kill(process.pid)
等的不同变体,但似乎没有什么可以完全退出该过程。
请注意,如果我只是运行node index.js
,我没有这个问题。清理逻辑运行,进程退出完成,没有问题。仅使用 nodemon 似乎是一个问题。
我不希望其他开发人员必须等待清理逻辑运行然后再次按 ctrl + c。我缺少什么来运行我的清理逻辑并完全退出终端中的进程?