hakobera's blog

技術メモ。たまに雑談

Connect ソースコードリーディング(5) - 小ネタをちょこちょこ

あまり時間が取れなかったので、第5回は小ネタをちょこちょこと。

HTTPServer の prototype チェーン(継承関係)

net.Server
 |- http.Server
       |- connect.HTTPServer - [mix-in] -> connect.HTTPSServer

なので、net.Server や http.Server のメソッドが普通に使えます。

HTTP ヘッダーは全部小文字になっている

前回も書きましたが、middleware にくる段階で HTTP ヘッダーのキーは全て小文字になっているので、注意。

JavaScript で QueryString をパースしてオブジェクト化する際のイデオム

bodyParser の中で出てきましたが、キーに対応するオブジェクトを探してきて、それが配列なら追加、単独のオブジェクトなら配列化して追加、オブジェクトが無いなら新規追加するコードです。Connect に限らずよく使われていますね。

 function ondata(name, val){
    if (Array.isArray(data[name])) {
      data[name].push(val);
    } else if (data[name]) {
      data[name] = [data[name], val];
    } else {
      data[name] = val;
    }
  }

TJ が書いた Connect の説明の超訳

原文: Connect - Middleware For NodeJS - TJ Holowaychuk

作者が書いているので、多分一番正確に middleware について説明されていると思います。下記は上記ブログを抜粋した上に超訳してしまっているので、気になる方は是非原文をお読みください。第4回までのソースコードリーディングをしてきた方には、以下の内容がどういう意味か、良くわかると思います。

Connect は抽象レイヤあり、Node 開発者に、Middleware と呼ばれる交換可能なコンポーネントを利用した、高速開発のための便利で、ハイパフォーマンスなソリューションを提供します。


Middleware とは


Middlware は Node 開発者にシンプルな "plug and play" モジュールを提供します。Middleware はいくらでも追加することができ、高速開発を助けてくれます。Connect の Middleware は handle() メソッドを export する普通の Node モジュールです。ただし、コンセプト的には「フィルタ」と「プロバイダ」の2つのカテゴリに分類されます。

「フィルタ」は Middleware スタック中の任意の位置に設定され、入力と出力データを加工するだけで、通常はリクエストに対するレスポンスを返しません。フィルタの1つの例としては、Connect が提供するログフィルターがあります。(connect.logger のこと)。これはどんなリクエストにも応答は返さず、単純にリクエストデータを出力するためのプロキシ関数を呼び出すだけです。

一方、「プロバイダ」はその名の通りスタックの終端を提供します(要するにレスポンスを返します。)。ただし、全てがこのケースに当てはまるわけではありません。例えば、json-rpc プロバイダは、リクエストの Content-Type ヘッダーが application/json でない場合は、なんの処理も行いません。プロバイダの典型的な例は 、静的ファイルを配信する static プロバイダです。

次回予告

まだ未定です。Node塾 その2で質問が出た内容に回答する、って形にしようかと思っています。