如何优雅地销毁Node.js http.request连接?

7
如果我在命令行中运行它,程序将在 client.destroy() 后停止。
var client = http.get(options, 
        function(res) {
            console.log(res.statusCode);
            client.destroy();
          }
);

然而,当我将client.destroy()放在res.on('end')中时,情况并非如此:
var client = http.get(options, 
        function(res) {
            console.log(res.statusCode);
            res.on('end', function() {
                console.log("done");
                client.destroy();
            });
          }
);

由于http.socket为空,程序将抛出异常。因此,我无法销毁它。

在这种情况下,程序执行将挂起并且不会结束。除了process.exit()之外,我该如何终止它呢?

3个回答

6

如果只是单个请求,你可以将shouldKeepAlive设置为false。

var request = http.get(options, 
        function(res) {
            console.log(res.statusCode);
          }
);
request.shouldKeepAlive = false

或者发送“Connection: close”头文件。
由于在请求“end”事件处理程序中已分离,因此无法访问套接字。请参考此处此处了解更多信息。

1
当我执行“request.shouldKeepAlive”时,它会对socket池产生任何影响吗? - murvinlai
最好使用Connection头,可以在这里分析 - https://github.com/joyent/node/blob/master/lib/http.js#L442 这会影响请求的shouldKeepAlive标志。 - Andrey Sidorov
各位,别再在“master”中链接行号了——这没用——你无法在移动的目标上链接行号。 - Armen Michaeli

1

0

关于你的问题: 通过http.get或http.request创建的请求默认会关闭其套接字(连接)。您不必手动关闭它。

关于您的代码示例: 在您的“res.on('end', yourCb)”之前,Nodejs已经注册了“res.on('end', responseOnEnd)”。 responseOnEnd将关闭套接字。因为responseOnEnd在yourCb之前被调用,所以您不能在res.on('end', yourCb)中销毁套接字。


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