我正在做一個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