为什么在未读取响应的情况下,节点http客户端仍在运行

Why does node http client keeps running if response is not read?

本文关键字:http 节点 客户端 运行 情况下 读取 响应 为什么      更新时间:2023-09-26

我刚刚开始使用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()的代码)。我观察到,如果最后一行被注释掉,客户端没有读取响应,那么客户端就不会终止。这背后的原因是什么?

这种行为是因为以下Node实现:
发布http.request()创建具有以下行为的对象http.ClientRequest

如果没有添加"响应"处理程序(即请求方法的第二个参数),则响应将被完全丢弃。但是,如果添加了"response"事件处理程序,则必须使用响应对象中的数据,方法是每当出现"可读"事件时调用response.read(),或添加"data"处理程序,或调用resume()方法。在数据被消耗之前,'end'事件不会触发。此外,在读取数据之前,它将消耗内存,最终可能导致"进程内存不足"错误。