因为我无法评论this question的答案,我想在这里得到一些帮助。
我有完全相同的代码,但输出如下:
/**
* Created by Ramiro on 09/06/2015.
*/
// Load the http module to create an http server.
var http = require('http');
// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
//console.log(dbHandler.GetDatabase());
var req = http.request('http://127.0.0.1:5984/_myUri', function(res) {
res.setEncoding('utf8');
var body = '';
// Streams2 API
res.on('readable', function () {
var chunk = this.read() || '';
body += chunk;
console.log('chunk: ' + Buffer.byteLength(chunk) + ' bytes');
});
res.on('end', function () {
console.log('body: ' + Buffer.byteLength(body) + ' bytes');
});
req.on('error', function(e) {
console.log("error" + e.message);
});
});
req.end();
response.end();
});
// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(3000);
使用此输出:
chunk: 230 bytes
chunk: 0 bytes
body: 230 bytes
chunk: 230 bytes
chunk: 0 bytes
body: 230 bytes
chunk: 230 bytes
chunk: 0 bytes
body: 230 bytes
所以我推断:
“readable”上的res.on被调用两次:
整个回调被调用了三次。
需要你的建议。
最佳答案
“readable”事件是为每个经过的块抛出的,有时会包含一个零散的0。我相信在您的案例中会发生这种情况,因为console.log行得到的是聚合的“body”值,而不是单个的“chunk”,所以您两次都看到230。(返回230,然后返回0,但每次的总数是230)。要获取总数据,只需连接在“end”回调中调用的所有块。看看这能给你带来什么:
var req = http.request('http://127.0.0.1:5984/_myUri', function(res) {
res.setEncoding('utf8');
var body = '';
// Streams2 API
res.on('readable', function () {
var chunk = this.read() || '';
body += chunk;
console.log('chunk: ' + Buffer.byteLength(chunk) + ' bytes');
});
res.on('end', function () {
console.log('body: ' + Buffer.byteLength(body) + ' bytes');
});
req.on('error', function(e) {
console.log("error" + e.message);
});
});
req.end();
但这并不能解释这3个电话。(当我在我的代码中运行您的确切代码时,由于我上面解释的原因,我得到了多个“chunk”行,但我只得到一个集合,只有一个“body”行)这是一个更大的测试程序的一部分吗?如果是的话,也许它在其他循环中被调用了3次?或者它可能会导致页面笨拙地刷新或重定向几次,并发送不表示“结束”的标题。我只是对nodejs中这个函数的工作原理知之甚少,无法解释这种异常。