正常关闭node.JS HTTP服务器

正常关闭node.JS HTTP服务器,http,node.js,exit,Http,Node.js,Exit,这是一个我正在开发的简单Web服务器 var server = require("http").createServer(function(req,resp) { resp.writeHead(200,{"Content-Type":"text/plain"}) resp.write("hi") resp.end() server.close() }) server.listen(80, 'localhost') // The shortest webserver

这是一个我正在开发的简单Web服务器

var server = require("http").createServer(function(req,resp) {
    resp.writeHead(200,{"Content-Type":"text/plain"})
    resp.write("hi")
    resp.end()
    server.close()
})
server.listen(80, 'localhost')
// The shortest webserver you ever did see! Thanks to Node.JS :)
除了“保持活力”之外,其他都很好。当第一个请求传入时,
server.close
被调用。但这一过程并没有结束。实际上TCP连接仍然是开放的,这允许另一个请求通过,这正是我试图避免的


如何关闭现有的保持活动连接

您可以在响应回调中调用
request.connection.destroy()
。这将关闭请求连接


它还将结束您的进程,因为已无事可做,最终结果与在此处调用
process.exit()
相同。

您可以控制连接的空闲超时,以便设置保持活动状态的连接将保持打开的时间。例如:

server=require('http').createServer(function(req,res) {
    //Respond
    if(req.url.match(/^\/end.*/)) {
        server.close();
        res.writeHead(200,{'Content-Type':'text/plain'});
        res.end('Closedown');
    } else {
        res.writeHead(200,{'Content-Type':'text/plain'});
        res.end('Hello World!');
    }
}).listen(1088);
//Set the idle timeout on any new connection
server.addListener("connection",function(stream) {
    stream.setTimeout(4000);
});

4秒后,连接关闭,服务器退出

如果您在正常关闭过程中关闭服务器,您只需要:

var server = require('http').createServer(myFancyServerLogic);

server.on('connection', function (socket) {socket.unref();});
server.listen(80);

function myFancyServerLogic(req, res) {
    req.connection.ref();

    res.end('Hello World!', function () {
        req.connection.unref();
    });
}

基本上,服务器使用的套接字只会在实际为请求提供服务时使进程保持活动状态。当他们无所事事地坐在那里时(因为有一个保持活动的连接),调用
server.close()。如果您需要在服务器关闭后执行其他操作,作为正常关机的一部分,您可以挂接到
进程.on('beforexit',callback)
以完成正常关机过程。

在每个连接上调用destroy需要我保留一个数组,并定期清除自动销毁的数组。但这可能行得通,为什么呢?请求对象与回调(req参数)中的响应一起传递,即在
resp.end()之后添加
req.connection.destroy()
我不想为了轻松关闭Web服务器而取消保持活动的功能。在
resp.end()
时,它可能不知道它将在接下来的几秒钟内关闭(在连接自动被破坏之前)。因此,它不知道应该破坏连接。这就是为什么它会添加到数组中。但实际上,有可能存在一个从未发出第一个请求的连接,这意味着我的第一条评论不能作为解决方案使用,退出可能是我的最佳选择(除了克隆
http.js
源代码之外)。我想对我的应用程序进行单元/功能测试。我能够启动应用程序服务器,但关闭时出现错误。如果我让服务器保持打开状态,它将在所有测试完成时被杀死。因此不需要使用
close()
。但是如果我在多个文件中测试。我无法重新启动服务器。因为close()无法停止服务器,而且我无法启动多个服务器。我想您实际上是让服务器在服务器运行期间更改超时。因此,如果您不希望关机,您可以延长保持活动状态的时间…感谢您在Node.JS中发布
ref
unref
是较新的选项,在发布其他答案时不可用。在我的情况下不起作用。。。请参阅以下摘录:…不是
server.on('connection',function(socket){socket.unref();})够了吗?@gingerplus正确,但我说的是
服务器。关闭
,而不是节点退出。当
setTimeout
过期时,可能已经没有什么可写的了。这是一个很小的测试(有时gist是有效的;在Chrome中使用新选项卡时,失败的可能性更大),但有时在“服务器关闭”之后什么都不会出现——我假设任何正在扫描套接字连接的东西都在某个计时器上,您必须正确地点击它。@ZachB:啊,我现在明白了。谢谢你的解释。
ben@quad-14:~/node$ echo -e "GET /end HTTP/1.1\nConnection: keep-alive\n\n" | netcat -C -q -1 localhost 1088
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: keep-alive
Transfer-Encoding: chunked

9
Closedown
0
var server = require('http').createServer(myFancyServerLogic);

server.on('connection', function (socket) {socket.unref();});
server.listen(80);

function myFancyServerLogic(req, res) {
    req.connection.ref();

    res.end('Hello World!', function () {
        req.connection.unref();
    });
}