【发布时间】:2022-01-11 02:36:56
【问题描述】:
我正在尝试为 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。我缺少什么来运行我的清理逻辑并在终端中完全退出进程?
【问题讨论】:
标签: node.js express process nodemon graceful-shutdown