我有一个自动启动的简单nodejs服务器。
它使用express来托管端点,该端点以简单的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
内的某种计时器)。
查看快速文档,我没有看到一种简单的方法来配置它。
有没有更简洁的方法来实现这种空闲关闭?
答案 0 :(得分:2)
app.listen()
会返回一个包装过的HTTP服务器(如in the source所示),然后您可以.close()
method。
var app = express();
var server = app.listen(port);
setTimeout(function() {
server.close();
}, 3 * 60 * 1000);
这将阻止服务器接受新连接。当它停止提供现有连接时,它将正常停止。这将完全停止Nodej。
编辑:您可能还会发现此GitHub issue相关。
答案 1 :(得分:0)
看看forever。您可以将它作为模块放入应用程序中,它为您提供了一些可以帮助您实现所需内容的功能(例如forever.stop(index)
,它终止在该索引上运行的节点进程。在终止进程之前,你可以检索进程列表并操纵字符串以获得正常运行时间。然后,我会监视服务器调用之间的时间。如果请求之间有3分钟的间隔,我会调用forever.stop()
为了终止这个过程。
答案 2 :(得分: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分钟后退出下一个请求。这可能无法解决您的问题