(8)http收集器

2018-02-24 16:05 更新

要求

編寫一個(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è)吧!

bl模塊API文檔
concat-stream模塊API文檔

要安裝一個(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)
     }))
    })
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)