我正在发出HTTP请求并收听“数据”:
response.on("data", function (data) { ... })
问题在于响应被分块,因此“数据”只是被发回的一部分。
如何将全身送回?
答案 0 :(得分:69)
request.on('response', function (response) {
var body = '';
response.on('data', function (chunk) {
body += chunk;
});
response.on('end', function () {
console.log('BODY: ' + body);
});
});
request.end();
答案 1 :(得分: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
});
});`
这解决了OP在scriptfromscratch的回答的评论部分提出的问题。
答案 2 :(得分: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
});
请参阅node.js docs以供参考。
答案 3 :(得分:5)
为了支持所有可能的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(缓冲区
列表)和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) ;
答案 4 :(得分:3)
它搞砸的原因是因为你需要调用JSON.parse(data.toString())。数据是缓冲区,因此您不能直接解析它。
答案 5 :(得分: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.
}
})
答案 6 :(得分:0)
HTTPS分块响应如何?我一直在尝试从API读取响应,该API通过HTTPS进行响应,其标题为Transfer-Encoding:chunked。每个块都是一个缓冲区,但是当我将它们全部合并在一起并尝试使用UTF-8转换为字符串时,我得到了奇怪的字符。