我的expressjs中有一个路由,它在区间上调用一些逻辑:
export const get = (req, res) => {
const { ids } = req.query;
let interval = setInterval(() => {
let id = ids.pop()
console.log("On id #:", id)
// do some stuff with the id
if (!ids.length) {
clearInterval(interval)
}
}, 1000)
interval.unref();
res.json();
};
因此,如果您找到了调用此函数的路由,代码每1秒运行一次,并打印控制台语句。这一切都在一个快递服务器内。如果这个过程顺利完成,那就太好了。然而,我注意到,即使我
ctrl c
在间隔循环完成之前,在服务器的运行进程之外,终端继续每1秒打印一次id,直到完成为止。
我认为
.unref()
该方法本应防止这种情况发生,但并没有效果。我也尝试过:
["exit", "uncaughtException", "SIGINT", "SIGTERM"]
.forEach(signal => {
process.on(signal, () => {
clearInterval(interval);
});
});
这似乎也没有任何效果。
当我关闭express服务器时,如何确保停止并清除任何运行间隔?
也许我的问题与服务器设置和清理的一些复杂逻辑有关。供参考:
import express from "express";
import { setRoutes } from "./routes";
let app = express();
const server = app.listen(8080, function () {
console.log(`ð§ Server is now running on port : ${8080}`);
});
app = setRoutes(app);
function stop() {
// Run some code to clean things up before server exits or restarts
server.on("close", function () {
console.log("⬠Shutting down server");
process.exit();
});
server.close();
}
process.on("SIGINT", stop);
process.on("SIGTERM", stop);
process.on("SIGQUIT", stop);
process.once("SIGUSR2", function () {
// Run some code to do a different kind of cleanup on nodemon restart:
process.kill(process.pid, "SIGUSR2");
});