Javascript 为什么我们需要为POST定义res.on(';数据';…即使我们没有对数据做任何事情?

Javascript 为什么我们需要为POST定义res.on(';数据';…即使我们没有对数据做任何事情?,javascript,node.js,http,Javascript,Node.js,Http,发现此问题调试代码,但以下代码不起作用: var req = http.request(options,function(res){ // res.on('error',cb(err)); res.on('end',function(){ cb(); }); }); 然而,以下措施确实起了作用: var req = http.request(options,fu

发现此问题调试代码,但以下代码不起作用:

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();
            });
        });

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


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

在这个实现中,
函数(res)
是一个回调,它必须至少为
'data'
'end'
事件注册监听器,即使它们实际上没有做任何事情

从:

在“响应”事件期间,可以向响应对象添加侦听器;尤其是侦听“数据”事件

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


res
变量是一个。如果单击链接并向下滚动到,您可能会发现以下内容:

请注意,“结束”事件将不会触发,除非数据被完全消耗


通过添加“数据”事件处理程序,您就可以使用数据。

因为文档在上告诉您的内容——也就是说,使用base Node.js
http
https
模块通常远没有在Express、Hapi和其他许多模块之上使用一个更好的工程化web服务器API有用。一个方便的解决方法:
res.on('data',Boolean)