【问题标题】:Node.js HTTP request returns 2 chunks (data bodies)Node.js HTTP 请求返回 2 个块(数据体)
【发布时间】:2014-03-27 18:19:00
【问题描述】:

我正在尝试通过 node.js 中的 HTTP 请求获取 HTML 文件的源 - 我的问题是它返回数据两次。这是我的代码:

var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        if(chunk.length > 1000) {
            console.log(chunk.length);
        }
    });
    req.on('error', function(e) {
        console.log("error" + e.message);
    });
});

req.end();

然后返回:

5637
3703

见鬼!当我只是 console.log(chunk) 时,它会返回所有数据,就好像它是一个大字符串一样,当我在 res.on('data',它返回整个字符串,中间的某个地方带有“数据从这里开始”,这意味着它只是被拆分了。

我所做的每个测试都会返回 2 个值,这真的很烦人。我可以做“if(chunk.length > 4000)”,但考虑到我得到的页面的性质,这可能会改变。我怎样才能使所有数据都以一大块返回?

【问题讨论】:

  • 最后一个可能是favicon.ico的请求
  • 这是完全正常的行为...console.log(chunk)'将在请求结果到达时为您提供。

标签: javascript node.js http httprequest


【解决方案1】:

这些不是“2 个数据主体”,它们是同一主体的 2 个块(片),您必须将它们连接起来。

var req = http.request(options, function(res) {

    var body = '';

    res.setEncoding('utf8');

    // 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();

【讨论】:

  • 当您设置encoding 时,您不会得到buffer objects nodejs.org/api/stream.html#stream_api_for_stream_consumers。 (您可以像这样nodejs.org/api/stream.html#stream_event_data 获得.length)。 ; )
  • @dollarVar,使用String.length,您不会得到实际的字节长度,因为 unicode 字符可以占用更多字节,例如 'acasă'.length 是 5 但 Buffer.byteLength('acasă')'acasă' 是 6,想想 :)
  • 嘿,我明白你的意思了 (+1)。你知道如何在runnable.com 上设置它来证明它吗?
  • 我的意思是,你得到一个buffer object,这就是我理解规范的方式,你没有得到一个(当你设置编码时)。
  • @dollarVar, runnable.com/Uwyzv6VsK55PAACO/buffer-bytelength-for-node-js , res 是一个可读流,默认情况下会产生缓冲区,要使其产生字符串,编码必须设置为utf8,但要获得实际长度Buffer.byteLength 正在使用的字节数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2021-08-16
相关资源
最近更新 更多