我有服务器
var connect = require('connect');
var serveStatic = require('serve-static');
var HTMLServer = function(path){
this.path = path;
this.server = connect().use(serveStatic(this.path));
this.startServer = function(callback){
this.server = this.server.listen(8080, callback);
};
this.stopServer = function(callback){
this.server.close(callback);
}
}
我使用它如下:
var thisServer = new HTMLServer(__dirname);
thisServer.startServer(function(){
console.log('Server running on 8080...');
setTimeout(function(){
thisServer.stopServer(function(){
console.log('Server closed');
});
}, 3000);
});
正如预期的那样,服务器启动并在3000毫秒后停止。
但是,如果我在这3000毫秒内向这个服务器发出请求,stopServer
被调用,但是服务器没有关闭。
我确信这行this.server.close(callback);
会被执行,但不会像我期望的那样关闭服务器。
我该怎么弥补?
对服务器的请求是否以需要特殊处理的方式更改服务器示例?
后期编辑:
我想添加一些精确度,现在我离开了代码运行。似乎服务器确实关闭了,但不是立即关闭,而是在一段时间之后,我不明白,不超过5分钟。
所以close
操作似乎被延迟了。我能以某种方式让它变得即时吗?
1条答案
按热度按时间chhkpiq41#
虽然@jfriend00是正确的,node.js会一直运行,直到所有退出的套接字完成,但
process.exit
解决方案对我的用例来说有点太激进了,我需要一个更干净的解决方案来优雅地关闭服务器。查看
getConnections
只会增加更多的困惑,因为它没有按预期运行。(例如,即使我没有发出任何请求,它也返回了2个连接)。我还查看了
server.listening
,但即使服务器接受更多请求,它也返回false
。可能在关闭服务器之前接受来自发出请求的客户端的连接。无论如何,对我来说,解决方案是使用
http-shutdown
库,它本质上是将以下.shutdown
方法添加到server
对象中。有了这个函数,我可以如下更新我的服务器,现在
stopServer
可以按预期工作了: