2

我有一个自动启动的简单服务器。

它使用来托管端点,该端点以一个简单的app.listen(port);命令启动。

由于我有一个自动启动,我想在空闲时间后关闭服务器 - 比如 3 分钟。

我只是使用下面的函数手动对其进行了编码,每个函数都会调用它app.post

//Idle timer
var timer;
function resetIdleTimer() {

    if (timer != null) clearTimeout(timer);

    timer = setTimeout(function () {
        logger.info('idle shutdown');
        process.exit();
    }, 3 * 60 * 1000);

}

不过,这似乎有点粗糙,所以我想知道是否有更简洁的方法(可能是某种计时器express)。

查看快速文档,我没有看到配置它的简单方法。

有没有更简洁的方法来实现这种空闲关机?

4

3 回答 3

2

app.listen()返回一个包装好的 HTTP 服务器(可以在源代码中看到),然后您可以在其上使用.close()方法.

var app = express();
var server = app.listen(port);
setTimeout(function() {
  server.close();
}, 3 * 60 * 1000);

这将阻止服务器接受新连接。当它停止为现有连接提供服务时,它将优雅地停止。这将完全停止 Nodejs。

编辑:您可能还会发现此GitHub 问题相关。

于 2013-11-12T14:27:42.807 回答
0

看看永远。您可以将它作为一个模块引入您的应用程序,它为您提供了一些功能,可以帮助您实现您正在寻找的东西(例如forever.stop(index)终止在该索引处运行的节点进程。在终止进程之前,您可以检索列表进程并操作字符串以获得正常运行时间。然后,我将监视服务器调用之间经过的时间。如果请求之间有 3 分钟的间隔,我会调用forever.stop()以终止进程。

于 2013-11-12T14:26:27.427 回答
0

我认为使用您的计时器解决方案并不“粗鲁”;我会采取稍微不同的策略:

app.timeOutDate = new Date().valueOf() + 1000*60*3; // 3 minutes from now, in ms

function quitIfTimedout(req, res, next){
  if(new Date().valueOf() > app.timeOutDate){
    logger.info('idle shutdown');
    process.exit();
  } else {
    app.timeOutDate = new Date().valueOf() + 1000*60*3; //reset
    next();
  }
};

app.all('*', quitIfTimedout);

但是,这实际上不会在 3 分钟后退出,而是会在 3 分钟后在下一个请求时退出。所以这可能无法解决您的问题

于 2013-11-12T14:26:30.863 回答