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

ajs*_*sie 51 http node.js

我正在发出HTTP请求并侦听"数据":

response.on("data", function (data) { ... })
Run Code Online (Sandbox Code Playgroud)

问题是响应被分块,因此"数据"只是被发回的一部分.

我如何将全身送回?

Per*_* P. 71

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

  • 是的,这就是问题所在。通过连接所有数据生成的正文不是有效的 json 格式,因此 JSON.parse() 会引发错误:( (2认同)

小智 25

https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc上,Tane Piper提供了一个非常类似于scriptfromscratch的解决方案,但对于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
     });
   });`
Run Code Online (Sandbox Code Playgroud)

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


sch*_*rmu 6

我从未使用过HTTP-Client库,但由于它的工作方式与服务器API类似,请尝试以下方法:

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

response.on('end', function() {
  // work with your data var
});
Run Code Online (Sandbox Code Playgroud)

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


Sal*_*lar 5

为了支持所有可能的HTTP应用程序,Node.js的HTTP API非常低级.因此,块数据不是整体收到的.
您可以采用两种方法解决此问题:

1)在多个"数据"事件中收集数据,
并在打印输出之前将结果附加在一起.使用"end"事件确定
流完成的时间,然后您可以编写输出.

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) ;
Run Code Online (Sandbox Code Playgroud)

2)使用第三方软件包来抽象
收集整个数据流所涉及的困难.两个不同的包
为解决这个问题提供了一个有用的API(可能还有更多!):bl(Buffer
List)和concat-stream; 随便挑选!

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) ;
Run Code Online (Sandbox Code Playgroud)