为什么我们需要为POST定义res.on('data'..,即使我们不处理数据

Why do we need res.on('data'... defined for POST even if we are not doing anything with the data?

本文关键字:data 使我们 数据 处理 我们 POST on res 定义 为什么      更新时间:2023-09-26

发现以下错误的调试代码:

var req = http.request(options,function(res){
            // res.on('error',cb(err));
            res.on('end',function(){
                cb();
            });
        });

然而,以下内容确实奏效了:

       var req = http.request(options,function(res){
            // res.on('error',cb(err));
            res.on('data',function(chunk){
                //why do we need this?
            });
            res.on('end',function(){
                cb();
            });
        });

res变量是一个可读流。如果你点击链接并向下滚动到"结束"事件,你可能会发现以下内容:

请注意,"结束"事件不会触发,除非数据被完全消耗掉。

通过添加"data"事件处理程序,可以使用数据。

这就是节点的背压机制的工作方式。如果响应流的缓冲区已满,它会"通知"服务器停止发送数据(这是在TCP层处理的)。因此,一旦您开始读取数据(通过res.read()或附加data处理程序,或简单地使用res.resume()),就会从服务器传输更多的数据,直到没有更多数据为止。只有当服务器没有更多数据可发送时,您才会收到end事件。我通常使用res.resume();,因为它要短得多。

自节点v0.10以来,这种行为就一直存在。在此之前,如果不立即附加data处理程序,实际上可能会丢失数据,所以可以想象这会给很多人带来问题。因此,对于nodev0.10+,默认行为是暂停,直到您开始阅读(这是在节点流层,与网络分离)。

在这个实现中,function(res)是一个回调,它必须至少为'data''end'事件注册侦听器,即使它们实际上什么都不做。

来自官方文件:

在"response"事件期间,可以向响应对象添加侦听器;特别是监听"数据"事件。

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