代码
var http = require('http');
var server = http.createServer().listen(4000);
server.on('close', function () {
console.log('close event', Date.now());
});
server.on('request', function (req, res) {
console.log('request', Date.now());
server.close(function () {
console.log('server closed!', Date.now());
});
res.end('res ok');
})
描述
为什么使用了 server.close()
,却不能触发 close
事件?
看了下 HTTP API 描述:
停止服务端接收新的连接。
以及 TCP API 描述:
使服务器停止接收新连接,只保持现存的连接。这个函数是异步的,当所有连接断开时,服务器关闭并且发出'close'事件...
原来 server.close()
只是使服务器停止接收新连接,并没有直接操作关闭服务器。只有当所有连接都断开的时候,服务器才会处于关闭状态并且发射 close
事件。
但是,代码改成延迟调用却可以直接关闭服务器(当然,得在5秒内建立一个HTTP
连接)。
var http = require('http');
var server = http.createServer().listen(4000);
server.on('close', function () {
console.log('close event', Date.now());
});
server.on('request', function (req, res) {
console.log('request', Date.now());
res.end('res ok');
})
function closeServer() {
server.close(function () {
console.log('server closed!', Date.now());
});
}
setTimeout(function () {
closeServer();
}, 5000);
问题
如果按照 API 中的描述,close()
方法只是 停止服务端接收新的连接。那么,为什么改为后面这种方式却可以直接关闭服务器?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…