为什么我们需要为POST定义res.on('data'..,即使我们不处理数据
Why do we need res.on('data'... defined for POST even if we are not doing anything with the data?
发现以下错误的调试代码:
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()方法。在数据被消耗之前,"结束"事件不会触发。此外,在读取数据之前,它将消耗内存,最终可能导致"进程内存不足"错误。
- 为什么我们需要为POST定义res.on('data'..,即使我们不处理数据
- 我们可以同时使级数变短和变平滑吗
- asp validationExpression中用于验证表达式的代码,使我们能够避免单词末尾的任何let(d)
- 使 jqgrid 填充从作为“data”传递的数据派生的数据
- 我们可以使数据列表自动完成以搜索文本和值吗?
- Javascript在X秒后使data-attr中的图像成为内联背景图像
- 我们如何使JavaScript属性全局化
- 为什么我们在从ajax json调用获取响应时使用data.d
- 我们如何使ckeditor对话框不可调整大小,不可拖动
- 在 data.feature 对象上添加工具提示,就像我们可以对标记所做的那样
- 我们可以在ev.target.appendChild(document.getElementbyId(data))中附加
- 添加数据到元素,使jquery's .data("key")工作
- 如何使yield工作与this.req.on('data'),而不需要更多的模块
- 我们如何使十进制后的数字看起来像javascript中的上标
- 我们来看看ember/ember-data对象的生命周期如何?或者调试Ember.js和Ember-Data的提示/提示
- Ember Data deleteRecord()之后是rollback() -如何使对象重新出现在列表中
- 我们如何使图像旋转木马与背景图像属性
- 我们如何使它这样,当用户点击任何地方,但弹出框,弹出框将关闭
- 如何使facebook通知框出现时,有人喜欢或评论我们的帖子
- 使jQuery Search Filter使用Data属性而不是整个DIV内容