发现此问题调试代码,其中以下内容不起作用:
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();
});
});
答案 0 :(得分:4)
res
变量是Readable Stream。如果您点击该链接并向下滚动到'end' event,您可能会发现以下内容:
请注意,'结束'事件不会触发,除非数据被完全消耗。
添加'数据'事件处理程序,您使用数据。
答案 1 :(得分:2)
节点的背压机制如何工作。如果响应流的缓冲区填满,它会告诉服务器停止发送数据(这是在TCP层处理的)。因此,一旦您开始阅读数据(通过res.read()
或附加data
处理程序或仅使用res.resume()
),服务器中的更多数据将被转移,直到某个点没有更多数据。只有当服务器没有更多数据要发送时,才会收到end
事件。我通常使用res.resume();
,因为它更短。
此行为自节点v0.10起已存在。在此之前,如果您没有立即附加data
处理程序,您实际上可能会丢失数据,因此您可以想象这会给很多人带来问题。因此,对于节点v0.10 +,默认行为是暂停,直到您开始阅读(这是在节点流层,与网络分开)。
答案 2 :(得分:2)
在此实现中,function(res)
是一个回调函数,必须至少为'data'
和'end'
事件注册侦听器,即使它们实际上没有做任何事情。
在回复期间'事件,可以将侦听器添加到响应对象;特别是要倾听数据'事件。
如果没有回应'添加处理程序,然后完全丢弃响应。但是,如果您添加“回复”#39;事件处理程序,然后你必须通过调用response.read()来消耗响应对象中的数据,只要有可读的'活动,或添加“数据”。处理程序,或通过调用.resume()方法。在数据被消费之前,'结束'事件不会开火。此外,在读取数据之前,它将占用内存,最终可能导致内存处理过程中的内存不足。错误。