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