为什么如果没有读取响应,节点http客户端会继续运行?

时间:2014-11-11 05:27:49

标签: javascript node.js

我刚刚开始使用Node.js,我正在尝试编写一个简单的http客户端,它只是向服务器发送一个post请求。

var req = http.request(
        {
                host : 'localhost',
                port: 3000,
                url : '/',
                method:'POST'

        },function(res){
                console.log('res status - ' + res.statusCode);
                res.on('data', function(){}); //<--------

        }
);

(我省略了写入请求并调用req.end()的代码)。我观察到如果最后一行被注释掉并且客户端没有读取响应,则客户端不会终止。这背后的原因是什么?

1 个答案:

答案 0 :(得分:3)

此行为是因为Node实施了以下因素:
发布http.request()会创建一个具有以下行为的对象http.ClientRequest

  

如果没有&#39; 回复&#39;处理程序(即请求方法的第二个参数)被添加,然后响应将被完全丢弃。但是,如果您添加“回复”#39;事件处理程序,然后您必须通过调用 response.read()来消费响应对象中的数据,只要有可读的&#39;事件,或添加&#39; 数据&#39;处理程序,或通过调用。 resume()方法。在消费数据之前,&#39; 结束&#39;事件不会开火。此外,在读取数据之前,它将占用内存,最终可能导致内存处理过程中的内存不足。错误。