2015年12月4日金曜日

learnyounodeを解いてみる(8問目)

learnyounode [ HTTP COLLECT]


1つ目のコマンドライン引数は URL 文字列です。 そのURL文字列を使ってHTTP のデーターをロード (※)するアプリを書いてください。 サーバから全て(最初のイベントだけではなく)のデータを集め、次の2行をコンソールに出力して下さい。 1行目は文字数です。2行目はサーバから受け取った全てのデータを文字列で出力してください。



こちらも出題内容が解りづらいかもしれませんが、バッファから得られるデータを纏めて文字数とその文字列を出力するだけです。 先回のものを少し変えるだけで出来そうですね。
response.on("data")で得られるデータはバッファなのでそれを繋ぎます。
あとはresponse.on("end")でlengthを使い文字数を出力し、文字列そのものを出力してやればいいだけです。

httpcollect.js
var http = require('http');

var url = process.argv[2];

http.get(url, function(res) {
    var out = "";
    res.setEncoding('utf8');
    res.on('data', function(chunk) {
    out += chunk;
    });
    res.on('end', function() {
    console.log(out.length);
    console.log(out);
    });
    res.on('error', function(err) {
     console.error("Error: " + err.message);
    });
});



さて、正解はこれでいいのですが、問題のヒントにblかconcat-streamパッケージを使ってくださいとあります。これら外部パッケージを使うこともNodeの魅力です。これを使って解いてみましょう。

これらはサードパーティ製なので使用するにはnpmでインストールする必要があります。

 $ npm install bl

blパッケージはBufferListの略でバッファをリストで加工できる様にしたパッケージでバッファを利用しやすくしています。
主な使い方は以下で説明されてます。
bl

特に利便性が高いのはコールバックを引数に持つのでpipeで繋げられることです。
ヒントにもあるのでその使用法で書きましょう。

response.pipe(bl(function(err, data) { }));
blのサイトには
// `data` is a complete Buffer object containing the full data と書いてあります。
つまりデータにはすべてのバッファを含めた状態で渡されるとあるので上と同じ処理をして完成です。気をつけることはbufferはバイナリのままなのでtoString()で文字列に変更することでしょうか?

blcollect.js
var http = require('http');
var bl = require('bl');

var url = process.argv[2];

http.get(url, function(res) {
    res.pipe(bl(function(err, data) {
 if(err) return console.error(err);
   console.log(data.length);
   console.log(data.toString());
    }));
});



# おめでとう!

「HTTP 集める」に対するあなたの回答は合格です!

これが正式な回答です(もしあなたの回答と比較してみたいならどうぞ):

───────────────────────────────────────────
    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)
      }))  
    })

以上です。

0 件のコメント:

コメントを投稿