我正在做一个HTTP请求和监听“数据”:当响应被分块时获取整个响应主体?
response.on("data", function (data) { ... })
的问题是,响应分块这样的“数据”只是发回了一块体的。
我如何得到全身发回?
我正在做一个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();
我从来没有与HTTP客户端库的工作,但因为它的工作原理就像服务器API,尝试这样的事情:
参考见node.js docs。
过在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的答案。
它被搞砸了的原因是因为你需要调用JSON.parse(data.toString())。数据是一个缓冲区,所以你不能直接解析它。
如果你不介意使用请求库
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.
}
})
为了支持可能的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) ;
为什么nodejs返回分块响应?有一些用途吗? – 2015-05-31 17:34:48