Http请求返回的体内数据多于预期

时间:2015-06-10 01:14:19

标签: javascript node.js http

由于我无法评论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

这让我推断:

  • res.on'可读'被调用两次:
  • 整个回调被调用三次。 需要你的建议。

1 个答案:

答案 0 :(得分:0)

每个传入的块都会抛出'可读'事件,有时会包含一个流浪0.我相信这会发生在你的情况下,并且因为你的console.log行获得了聚合的“body”值而不是个人“大块”,你两次都看到230。 (它返回230然后是0,但每次总计为230)。要获得总数据,您只需要连接“结束”回调中调用的所有块。看看这会让你:

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中如何工作以解决这种异常。