pig's diary

何でも忘れるので万年初心者ね

node.jsを始める:サーバがあまりわからないjs書きが

※結論が誤っている可能性があります。 ※だいぶ、間違っていたようです。 id:koichikさん、アドバイスをくださいましてありがとうございます!

せっかくJSがすこしは書けるので、サーバjsもやってみたいと思ったので初めてみました。

さっそく不安に

で、上記「node.js ハンズオン資料を始めから見て行こうと思ったのですが、一番始めのページで、さっそく「ん?」と不安になる所がありました。

http.clientRequset オブジェクトは,レスポンスの受信時に実行される response という名前のイベントを持っています.このイベントは http.clientResponse オブジェクトを引数に受け取ります.http.clientResponse オブジェクトはHTTPレスポンスヘッダーの値および,レスポンスを受け取るための各種イベントを持っています.

http://dl.dropbox.com/u/219436/node.js/handson/build/html/intro/async_io.html#id2

とりあえず始めはなんのことか分からなかったです。でも分からない点を整理すると

  1. リクエストを出す。
  2. 'on response'、レスポンスを受け取る。
  3. 'on data' // ←なにが起こった?

と、response.on('data', fn) のタイミングの意味が分かりませんでした。

(たぶん)「on data」は、普通のJSでいうところの「content loaded」※on dataは、ボディにアクセスできるタイミングの時もあれば、チャンク化されてれば、各チャンクにアクセスできるタイミングでもあるみたいです。※チャンクの場合もあるし、パケット到着のこともあるし、分断されたバッファのひとつが到着したタイミングでもあるみたいです。

なのかな。おそらく。(間違ってたら教えてください!)
だってこちらの例でも、on dataのあとにbodyみたいの拾ってるし。

タイミングを知るために、こんなプログラムを作ってみました。

/* query1.js
1. リクエスト!
2. レスポンス(ヘッダ)
3. レスポンス(本文)
4. response.on end

のタイミングのずれを、msで出力します。
*/

Date.prototype.getDelta = function(){
    return parseInt(new Date() - this, 10);
};
var d = new Date();
var http = require('http');
var google = http.createClient(80, 'www.google.com');

// 1. リクエスト!
var request = google.request('GET', '/',{'host': 'www.google.com'});
console.log('requested!: ' + d.getDelta());
request.end();
request.on('response', function (response) {
    
    // 2. レスポンス(ヘッダ)
    console.log('request.on response: ' + d.getDelta());
    response.setEncoding('utf8');
    
    // 3. レスポンス(本文)
    response.on('data', function (chunk) {
        console.log('response.on data: ' + d.getDelta());
    });
    
    // 4. response.on end
    response.on('end', function(){
        console.log('response.on end: ' + d.getDelta());
    });
});

これを走らせると、このような結果に。

$node query1.js
requested!: 19
request.on response: 81
response.on data: 82
response.on end: 83

ズレ方も、レスポンスがあってからon data、on endの差はあまりないし。おそらく、こういう事なんじゃないかな・・・

  1. request : リクエスト出す。
  2. response : ヘッダ受け取る(ヘッダ情報にアクセス可能になる。200なのか、404なのか500なのかが分かる※正確にいうと200とか404はヘッダ情報ではなくHTTPステータスコード(response.statusCode)として別腹の模様参考
  3. response.on('data', fn) : 本文受け取る(ドキュメントにアクセス可能になる。content loadedみたいな)※on dataは、ボディにアクセスできるタイミングの時もあれば、チャンク化されてれば、各チャンクにアクセスできるタイミングでもあるみたいです。※チャンクの場合もあるし、パケット到着のこともあるし、分断されたバッファのひとつが到着したタイミングでもあるみたいです。
  4. response.on('end', fn) : 全部完了。(window.loadedみたいな)

とりあえずそれで理解。もし間違ってたらいつかエラー出るし、原因が分かったらまた脳みそ上書けばいいや。←アウト〜〜!笑