如何正确地“关闭”一个node.js服务器?

4
根据文档调用server.close()将会:

停止服务器接收新的连接,但维持已有的连接。

因此我的代码如下:
var http = require('http');

var server = http.createServer(function (req, res) {
    console.log('path: ' + req.url);

    server.getConnections(function (err, count) {
        console.log('connections: ' + count);

        res.end('end');

        server.close();
    });
});

server.listen(3000);

server.on('close', function () {
    console.log('server closed');

    process.exit(1);
});

在向 http://localhost:3000 发起两个请求后,我得到了以下结果:

> path: /                              connections: 1                   
> path: /                              connections: 1                   
> 
>                                      net.js:1236                         
>     throw new Error('Not running'); 
>           ^                          Error: Not running                  
>     at Server.close (net.js:1236:11)

这意味着即使在第一次连接期间我调用了 server.close(),第二个连接仍然被接受。

我错过了什么吗?

编辑:根据 @gino9 的评论,即使在 getConnections 回调之外关闭服务器,问题仍然存在。

var server = http.createServer(function (req, res) {
    console.log('path: ' + req.url);

    res.end(new Date() + '');

    server.close();
});

捕获(特定的)异常还是通过标志跟踪手动关闭? - user2864740
请注意,您正在从异步getConnections的回调函数中调用server.close(),然后您无法确定服务器是否在处理第二个请求之前关闭。 - matteo
@user2864740 我这样做了,没有异常,但是传入的请求仍然被接受和服务。我的问题是为什么会发生这种情况? - simich
@gino9 将 server.close() 移到外面并不能解决这个问题。 - simich
1个回答

2

我最初不同意你的建议,但是在仔细检查后,我意识到了发生了什么。我一直在进行F5请求,因此使用keep-alive头部时这是相同的连接。尝试使用不同的浏览器显示出新的连接确实被拒绝了。谢谢! - simich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接