Write and Run

it's a simple way, but the only way.

ミドルウェア型の問題点と解決策

こんにちは、明日から学校だけど、まだまだコード書いてます。年賀状出す暇がなかったので寒中見舞いで許してください > 各位。

本題

Node.js の Web フレームワークといえば、Express が有名ですが、この Express の構造、自分はとっても嫌いなのです。
Express は「ミドルウェア」という形でモジュールを差し込み、Cookie や Session、BodyDecoder などの機能を組み込みます。一見綺麗に見えますが、実際組み込んでみると、驚くほど見通しが悪くなります。具体的には、request オブジェクトにどんなプロパティがあるのか、どういう構造をしているのか、というのがわからなくなります。このわかりづらさは多重継承に似ています。

解決策#1

そこで自分は考えました。request オブジェクトを拡張することをやめたらどうか、と。
するとこんな感じに。

function handler (req, res) {
  session = Session.getSession(req);
  doSomething();
}

しかしこの手法、セッションを扱うハンドラがたくさんあったらその分だけ getSession を書かなければならなくなります。それはよくない。

解決策#2

ではこんなのはどうだろう。

function before (req, res) {
  this.session = Session.getSession(req);
}

function handler1 (req, res) {
  doSomething();
}

function handler2 (req, res) {
  doSomething();
}

// 呼び出し側
var handling = new Handling();
before.call(handling, req, res);
handler1.call(handling, req, res);

なんか理想に近くなった。案外アリかもしれない。
でもなんかぐぬぬ感否めないのでまだいろいろ考える必要がありそうです。