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.jshttp
和https
模块通常远没有在Express、Hapi和其他许多模块之上使用一个更好的工程化web服务器API有用。一个方便的解决方法:res.on('data',Boolean)