hakobera's blog

技術メモ。たまに雑談

Connect ソースコードリーディング(6) - 組込み middleware 紹介

第6回目は、標準でバンドルされている組込み middleware の一挙に紹介します。API の詳細は公式サイトソースコードを参照してもらうとして、ここでは概要レベルの詳細にします。

昨日紹介した TJ の記事に基づいて、フィルタとプロバイダの2つに分類してみました。

フィルタ系

  • basicAuth
    • Basic 認証機能を提供します。
  • bodyParser
    • POST データをパースして、req.body に設定します。
  • compiler
    • SASS, LESS を CSS に、CoffeeScript を JavaScript にコンパイルします。元データを変更すると再コンパイルされます。
  • cookieParser
    • Cookie をパースして、req.cookies に設定します。
  • csrf
    • CSRF 攻撃を防ぐために _csrf という名前のトークンを生成して、セッションに設定します。リクエスト時に、この値と req.body._csrf か req.query._csrf か req.headers['x-csrf-token'] のいずれかから値を取得し、等しいかどうかチェックします。この middleware は session に依存しているので、use するのは、cookieParser と session より後に書かなくてはいけません。
  • limit
    • リクエストデータのサイズに上限を設定します。リクエストのデータしずは 'Content-Length' ヘッダーから取得します
  • logger
    • リクエストを指定したフォーマットで出力します。デフォルトではレスポンス時間を出力するためにレスポンス時にログを出力しますが、immediate オプションを指定することで、リクエスト時にログを出力することもできます。
  • methodOverride
    • PUT, HEAD, DELETE を送信できないクライアント(主にブラウザ)からの HTTP メソッドを 'X-HTTP-Method-Override' ヘッダーで指定されたメソッド名で上書きします
  • profiler
    • レスポンス時間、メモリの使用量などのプロファイル情報をコンソールに出力します。res.end メソッドの proxy を設定するため、一番最初に use するようにしてください。
  • query
    • クエリパラメータをパースし、req.query に Object として設定します。ネストパラメータに対応するために、url.parse でパースした後に、qs.parse で再パースしています。
  • responseTime
    • res.writeHead メソッドを proxy し、X-Response-Time レスポンスヘッダにレスポンス時間を設定します。
  • session
    • セッション機能を提供します。セッションは初回アクセス時に作成され、req.session に設定しれます。セッションのデータがどうやって格納されるかは store オプションに指定した Store インスタンスが使用されます。標準で提供されているのは、MemoryStore と CookieStore です。res.writeHead, res.end メソッドを proxy し、レスポンスに自動的に Set-Cookie ヘッダを付与します。この middleware は cookieParser に依存しています。
  • vhost
    • VirtualHost 機能を提供します。指定したホスト名でアクセスがあった場合、指定した connect.HTTPServer のインスタンスへ処理を委譲します。
     connect(
        connect.vhost('foo.com',
          connect.createServer(...middleware...)
        ),
        connect.vhost('bar.com',
          connect.createServer(...middleware...)
        )
      );

プロバイダ系

  • directory
    • 指定したディレクトリ配下のファイルをツリー形式で表示します。
  • errorHandler
    • エラーが発生した場合に、エラーページを送信します。設定により、スタックトレースを出力することもできます。
  • favicon
    • /favicon.ico に対するリクエストに対して、設定した画像もしくはデフォルトの画像をレスポンスとして返します。
  • router
    • Express のようなルーティング機能を提供します。
  • static
    • 静的ファイルをレスポンスとして返します。
  • staticCache
    • 静的ファイルをメモリ上にキャッシュして、ヒットした場合はファイルを読み込まずに返します。static に依存していて、処理としては static 内で req.emit('static') を呼んでいる箇所があり、これを staticCache の req.on('static', function() ...) で受け、キャッシュを返すようになっています。