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で質問が出た内容に回答する、って形にしようかと思っています。