响应被分块时获得整个响应主体?

我正在做一个HTTP请求,并听取“数据”:

response.on("data", function (data) { ... }) 

问题是响应被分块,所以“数据”只是一个被发回的主体。

我怎么把全身送回来?

 request.on('response', function (response) { var body = ''; response.on('data', function (chunk) { body += chunk; }); response.on('end', function () { console.log('BODY: ' + body); }); }); request.end(); 

通过https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc,Tane Piper提供了一个非常类似于scriptfromscratch的解决scheme,但对于JSON响应的情况:

  request.on('response',function(response){ var data = []; response.on('data', function(chunk) { data.push(chunk); }); response.on('end', function() { var result = JSON.parse(data.join('')) return result }); });` 

这解决了OP在scriptfromscratch的回答的评论部分提出的问题。

我从来没有使用HTTP客户端库,但因为它像服务器API一样工作,请尝试如下所示:

 var data = ''; response.on('data', function(chunk) { // append chunk to your data data += chunk; }); response.on('end', function() { // work with your data var }); 

请参阅node.js文档以供参考。

这是因为你需要调用JSON.parse(data.toString())。 数据是一个缓冲区,所以你不能直接parsing它。

为了支持所有可能的HTTP应用程序,Node.js的HTTP API是非常低级的。 所以数据不是按块来接收的。
有两种方法可以解决这个问题:

1)在多个“数据”事件中收集数据并追加结果
一起打印输出。 使用“结束”事件来确定
当stream完成,你可以写输出。

 var http = require('http') ; http.get('some/url' , function (resp) { var respContent = '' ; resp.on('data' , function (data) { respContent += data.toString() ;//data is a buffer instance }) ; resp.on('end' , function() { console.log(respContent) ; }) ; }).on('error' , console.error) ; 

2)使用第三方软件包来抽象涉及的困难
收集整个数据stream。 两个不同的包提供了一个
有用的API来解决这个问题(可能还有更多!):bl(Buffer
列表)和concat-stream; 拿你的select!

 var http = require('http') ; var bl = require('bl') ; http.get('some/url', function (response) { response.pipe(bl(function (err, data) { if (err) { return console.error(err) } data = data.toString() ; console.log(data) ; })) }).on('error' , console.error) ; 

如果你不介意使用请求库

 var request = require('request'); request('http://www.google.com', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // Print the google web page. } })