代码之家  ›  专栏  ›  技术社区  ›  Seth Lutske

即使在nodejs进程/服务器退出后,setInterval仍会继续

  •  0
  • Seth Lutske  · 技术社区  · 4 年前

    我的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");
    });
    
    0 回复  |  直到 4 年前
    推荐文章