Skip to content

Commit

Permalink
feat(connect): メリットとデメリットついて
Browse files Browse the repository at this point in the history
  • Loading branch information
azu committed Sep 19, 2015
1 parent d14ddf5 commit 54c1c52
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions ja/connect/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ Rackを参考にして実装されています。

## 実装してみよう

`Junction`というConnectライクな_middleware_をサポートしたものを作成してみます
JunctionというConnectライクな_middleware_をサポートしたものを作成してみます

`Junction``use(middleware)``process(value, (error, result) => { });`を持っているシンプルなクラスです。
Junctionは`use(middleware)``process(value, (error, result) => { });`を持っているシンプルなクラスです。

[import junction.js](../../src/connect/junction.js)

Expand All @@ -130,3 +130,35 @@ Rackを参考にして実装されています。

[import junction-example.js](../../src/connect/junction-example.js)


## どういう用途に向いている?

ConnectやJunctionの実装を見てみると分かりますが、このアーキテクチャでは機能の詳細は_middleware_で実装されます。
そのため、本体の実装は_middleware_に提供するインタフェースの決定、エラーハンドリングの手段の提供などとても小さいものとなっています。

今回は紹介していませんが、Connectにはルーティングに関する機能があります。
しかし、この機能も「与えられたパスにマッチした場合のみに反応する_middleware_を登録する」という単純なものです。

```js
app.use('/foo', function fooMiddleware(req, res, next) {
// req.url starts with "/foo"
next();
});
```

このアーキテクチャは、入力があり出力がある場合にコアとなる部分は小さく実装できることが分かります。

そのため、ConnectやRackなどのHTTPサーバでは「リクエストに対してレスポンスを返す」というのが決まっているので、
このアーキテクチャは適しています。

## どういう用途に向いていない?

このアーキテクチャでは機能の詳細が_middleware_で実装されます。
また、_middleware_を登録する順番に強く依存していることが分かります。

そのため、`use(middleware)` で登録する順番が変わるだけで挙動が変わる事があります。
_middleware_間に依存関係がある場合に、特定の順番で登録しなければならないという制限が作られる場合もあります。

_middleware_は柔軟ですが、_middleware_間で起きる複雑な前提の解決を利用者が行わなくなる可能性があります。

これらを解消するためにコアはそのままにして、最初から幾つかの_middleware stack_を作ったものが提供されるケースもあります。

0 comments on commit 54c1c52

Please sign in to comment.