2011-02-22 91 views
46

我正在做一个HTTP请求和监听“数据”:当响应被分块时获取整个响应主体?

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

的问题是,响应分块这样的“数据”只是发回了一块体的。

我如何得到全身发回?

+4

为什么nodejs返回分块响应?有一些用途吗? – 2015-05-31 17:34:48

回答

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

是的,我也试过,问题是身体将是一个JSON无效格式..结局是有点乱了,我认为这是一个空格或一个新的行,使JSON.parse无法解析它。 – ajsie 2011-02-22 21:17:03

+0

如果你的身体是json消息,你需要将字符串解析为JSON(例如'JSON.parse(body);') – schaermu 2011-02-22 21:19:03

+1

是的,这是问题所在。通过连接所有数据生成的主体不是有效的json格式,所以JSON.parse()会抛出一个错误:( – ajsie 2011-02-22 21:37:55

5

我从来没有与HTTP客户端库的工作,但因为它的工作原理就像服务器API,尝试这样的事情:

参考见node.js docs

20

过在https://groups.google.com/forum/?fromgroups=#!topic/nodejs/75gfvfg6xuc,田根派提供了一个很好的解决方案非常相似,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 
    }); 
    });` 

这解决了OP在评论部分提出了问题从scriptratscratch的答案。

3

它被搞砸了的原因是因为你需要调用JSON.parse(data.toString())。数据是一个缓冲区,所以你不能直接解析它。

1

如果你不介意使用请求库

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. 
    } 
}) 
3

为了支持可能的HTTP应用的全方位,Node.js的的HTTP API非常级别低。所以数据被大块接收而不是整体。
有可以采取的这一问题两种方法:

1)收集跨多个数据的“数据”事件和之前的打印输出结果
追加在一起。当数据流完成并使用“结束”事件确定
并且可以写入输出。

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)使用第三方软件包抽象收集数据的整个流参与
的困难。两个不同的包为解决这个问题提供了一个有用的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) ;