(8)http收集器

2018-02-24 16:05 更新

要求

編寫一個程序,發(fā)起一個 HTTP GET 請求,請求的 URL 為所提供的命令行參數的第一個。收集所有服務器所返回的數據(不僅僅包括 “data” 事件)然后在終端(標準輸出 std out)用兩行打印出來。

所打印的內容,第一行應該是一個整數,用來表示收到的字符串內容長度,第二行則是服務器返回的完整的字符串結果。

提示

有兩種實現方法:

1) 可以把所有 “data” 事件所得的結果收集起來,暫存并追加在一起,而不是在收到后立刻打印出來。通過監(jiān)聽 “end” 事件,可以確定 stream 是否完成傳輸,如果傳輸結束了,就可以將收集到的結果打印出來了。

2) 使用一個第三方模塊,來簡化從 stream 中收集數據的繁瑣步驟。這里有兩個不同的模塊都提供了一些有用的 API 來解決這個問題(似乎還有好多另外的模塊可以選哦?。篵l (Buffer list) 或者 concat-stream,來選一個吧!

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號