节点HTTP请求未返回所有数据

Node HTTP request not returning all data

本文关键字:数据 返回 HTTP 请求 节点      更新时间:2023-09-26

我在从网站下载完整数据时遇到问题。我正在做以下

request({url: 'http://somehost/somefile.txt'}, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(response.headers);
        console.log(body.length)
    }
});

当在上面下载时,长度为64472字节。内容长度为65536。文件格式不正确。

如果我使用wget获取该文件,则得到的长度为65536,是一个合适的文件。

有什么想法可以让Node复制wget的结果吗?我试着将用户代理更改为wget,以防出现这种情况。

谢谢!

UPDATE:request已经有encoding选项一段时间了,只使用它而不是手动缓冲更容易。对于二进制数据,您可以如request自述中所述设置encoding: null,以获取包含二进制数据而不是(utf8)字符串的单个Buffer实例。任何非nullencoding值都将直接传递给内部Buffer.toString()方法。


问题是,当您将回调作为第二个参数传入时,request模块将响应数据缓冲为utf8字符串。因此,对于二进制数据(或者对于节点不支持开箱即用的编码中的文本数据),您需要手动缓冲数据。例如:

request({url: 'http://somehost/somefile.txt'}).on('response', function(res) {
  // res === http.IncomingMessage object
  var buffer = [],
      bufsize = 0;
  response.on('data', function(data) {
    buffer.push(data);
    bufsize += data.length;
  }).on('end', function() {
    var body = Buffer.concat(buffer, bufsize);
    // body now contains the raw binary data
  });
});