編寫一個程序,發(fā)起一個 HTTP GET 請求,請求的 URL 為所提供的命令行參數的第一個。收集所有服務器所返回的數據(不僅僅包括 “data” 事件)然后在終端(標準輸出 std out)用兩行打印出來。
所打印的內容,第一行應該是一個整數,用來表示收到的字符串內容長度,第二行則是服務器返回的完整的字符串結果。
有兩種實現方法:
1) 可以把所有 “data” 事件所得的結果收集起來,暫存并追加在一起,而不是在收到后立刻打印出來。通過監(jiān)聽 “end” 事件,可以確定 stream 是否完成傳輸,如果傳輸結束了,就可以將收集到的結果打印出來了。
2) 使用一個第三方模塊,來簡化從 stream 中收集數據的繁瑣步驟。這里有兩個不同的模塊都提供了一些有用的 API 來解決這個問題(似乎還有好多另外的模塊可以選哦?。篵l (Buffer list) 或者 concat-stream,來選一個吧!
要安裝一個 Node 模塊,需用到 Node 的包管理工具 npm,輸入:
$ npm install bl
這樣,相應的模塊的最新版本便會被下載到當前目錄下一個名為 node_modules 的子目錄中 。任何在這個子目錄中的模塊都可以簡單地使用 require 語法來將模塊載入到程序中 ,并且不需要加 ./ 這樣的路徑前綴,如下所示:
var bl = require('bl')
可以把一個 stream pipe 到 bl 或 concat-stream 中去,它們會收集數據。一旦 stream 傳輸結束,一個回調函數會被執(zhí)行,并且,這個回調函數會帶上所收集的數據:
response.pipe(bl(function (err, data) { /* ... */ }))
// 或
response.pipe(concatStream(function (data) { /* ... */ }))
要注意的是可能需要使用 data.toString() 來把 Buffer 轉換為字符串。
方法一
var http = require('http');
http.get(process.argv[2], function(res){
var result = '';
res.setEncoding('utf8');
res.on('data', function(data){
result += data;
});
res.on('end', function(data){
console.log(result.length);
console.log(result);
});
});
方法二
var http = require('http')
var bl = require('bl')
http.get(process.argv[2], function (response) {
response.pipe(bl(function (err, data) {
if (err)
return console.error(err)
data = data.toString()
console.log(data.length)
console.log(data)
}))
})
更多建議: