2011-02-22 71 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) ;