0

我正在尝试为 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。我缺少什么来运行我的清理逻辑并完全退出终端中的进程?

4

1 回答 1

0

肯定有一个开放的连接。检查这个可以告诉你哪个包:https ://www.npmjs.com/package/wtfnode

于 2022-01-10T18:25:54.980 回答