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

我刚刚开始使用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()会创build一个具有以下行为的对象http.ClientRequest

如果没有添加“ 响应 ”处理程序(即请求方法的第二个参数),则响应将被完全丢弃。 但是,如果添加一个“响应”事件处理程序,则必须从响应对象中消费数据,无论何时出现“可读”事件或通过添加“ 数据 ”处理程序,都要调用response.read()通过呼叫。 resume()方法。 在数据消耗之前,“ 结束 ”事件不会触发。 此外,直到数据被读取,它会消耗内存,最终可能导致“处理内存不足”的错误。