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

时间:2014-09-23 17:10:54

标签: javascript node.js

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

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

上面下载时长度为64,472字节。内容长度为65,536。该文件格式错误。

如果我使用wget获取文件,则生成的长度为65,536,并且是正确的文件。

任何想法如何让Node复制wget的结果?我尝试将用户代理更改为wget以防万一。

谢谢!

1 个答案:

答案 0 :(得分:3)

更新: request现在有一段encoding选项,而且更容易使用它而不是手动缓冲。对于二进制数据,您可以设置encoding: null中提到的Buffer以获取包含二进制数据而不是(utf8)字符串的单个null实例。任何非encoding Buffer值都会直接传递到内部request的{​​{3}}。


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

{{1}}