2011-08-08 4 views
3

ここでは、慣れる続けNodeJSためConnectJSに関連するドキュメントで使用される用語の3枚ですが、私は完全にundertandないこと:いくつかの接続の用語

1)ビューとコントローラ

2)パーシャルコレクション

3)ミドルウェア

答えて

8

下から上に向かってみましょう。

レベル0:内蔵httpモジュール

先頭にノードがあります。Ryan Dahlによって書かれたjsの内蔵http.Server。あなたはfunction(req, res)を書き、ノードは、新しい接続が受け入れられるたびに、あなたの関数を呼び出します:

// Hello world HTTP server using http module: 
var http = require('http'); 
var app = http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hello, world.'); 
}); 
app.listen(8080, '127.0.0.1'); 

レベル1:ティム・キャスウェルによって書かれた、

Connectを接続していることを単にhttp.Serverのサブクラスでありますコードの整理が容易になります。すべての要求を処理する単一のコールバックを作成する代わりに、ミドルウェアを連鎖させます。各ミドルウェアは、可能であれば要求を処理するfunction(req, res, next)であり、ユーザー要求の処理が完了していない場合はnext(error)を呼び出します。ミドルウェアハンドラは、useの順に呼び出されます。最後にキャッチオールapp.use(connect.errorHandler())と呼ぶべきです。

重要なミドルウェアの1つはルータです。これにより、URLパスのパターンに基づいてミドルウェアをフィルタリングすることができます。 syntax for the route patternsは、ルビーのSinatraルートに基づいています。フィルタ/hello/:nameを使用すると、req.params.nameがURLの一致する部分に設定されます。

var connect = require('connect'); 
var app = connect.createServer(); 
app.use(connect.favicon()); 
app.use(connect.logger());, 
app.use(connect.router(function(app) { 
    app.get('/hello/:name', function(req, res, next) { 
    try { 
     if (Math.random() > 0.5) { 
     throw new Error('Random error!'); 
     } 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.end('Hello, ' + req.params.name); 
    } catch (e) { 
     return next(e); 
    } 
    }); 
})); 
app.listen(8080, '127.0.0.1'); 

すべてのハンドラはミドルウェアです。 bodyParserやcookieParserのような必要な機能を使用し、独自のビジネスロジックは同じシグネチャfunction(req, res, next)のミドルウェア機能です。 connect homepageには、組み込みミドルウェアのリストが表示されます。

レベル2:TJ Holowaychukによって書かれExpress.js

エクスプレスのhttpサーバは、今度はより多くのシナトラのスタイルを強制的に接続のサブクラスです。 Connectでは、あなたが求めていない魔法はありませんでしたが、Expressではルータとqsパーサー(req.queryを設定)は自動的にuseです。ルータ構文がクリーンアップされました。 app.getapp.postなどと直接呼び出す(ルータは最初の呼び出しで配置されます)。

Expressには、多くの他のwell-documented機能とapp、req、resを拡張するヘルパー機能が含まれています。エクスプレスの

一つの特徴は、(コレクションの各要素に対してレンダリング呼び出し、拡張子によって暗黙のテンプレートエンジンを使用して(app.set('views')または$ PWD /ビューに対して)指定したテンプレートファイルをレンダリングres.render、およびres.partial、ありますちょうどあらゆるarraylikeオブジェクトです)。しかし、私はこのオプション機能を使用していません。エクスプレスのテンプレートを気にしない場合は、自分でres.sendデータを送信することができます。

+0

ありがとうございました! 1つの質問:「qsパーサー」とは何ですか? – Randomblue

+0

'qs'は、HTTPクエリ文字列の解析に使用できる' parse'メソッドを持つ 'qs'モジュール(Query String)で構築されたnode.jsです。 http://nodejs.org/docs/v0.5.3/api/querystring.html#querystring.parse –

+0

私はかなりルータに接続して(2013年4月現在)出荷しています。 urlrouterと呼ばれるミドルウェアがあります。 – sheldonh

3

ここにいくつかのコメントがあります。より具体的な質問がある場合は、それらに対処することができます。

1)ビューとコントローラ

ビューだけで、通常はHTMLですが、プレーンテキストまたは他のいくつかのフォーマットである可能性が応答を、レンダリングするために使用できるテンプレートを意味します。そこには多くの異なるテンプレート構文とシステムがあります。 NodeJSとWebブラウザで動作するものもあります。それがすべてです。

コントローラは、MVCデザインパターンの「C」であり、ビューとモデルの仲介役を担います。基本的には、モデルコードに属していない選択肢を書式設定するなどの基本的なことを処理する接着剤です。

2)パーシャルとコレクション

(サイドコメント、これらが接続していない、本当にExpress.jsの一部ですが、彼らはライブラリ兄弟している)

パーシャルの小さな部分やスニペットを表す文書テンプレートです完全なHTML文書とは対照的に、パーシャルは他のテンプレートに含めることができ、多くの場合、複数のテンプレートを含むテンプレートで再利用されます。コレクションはそれらと手を携えて行きます。たとえば、「大統領」オブジェクトを部分的に表示し、その部分に写真のマークアップを付けると、社長、政党などの役割を果たす日付になることがあります。 "大統領"記録/オブジェクトを表示したかった。いくつかの「大統領」オブジェクトのコレクションがある場合、「コレクション」は、「このリストの各代表オブジェクトの大統領を部分的に表示する」と言う簡単な方法を提供します。

3)ミドルウェア

方法は、HTTP要求に応答ハンドルを接続する経路にミドルウェアと呼ばれる関数の一連の要求です。各ミドルウェア機能は基本的なAPIである(req, res, next)といくつかの動作要件に準拠しています。ミドルウェアの各部分は1つの処理の特定のビットを実行できます。終了したら、next()を呼び出してconnectにチェーン内の次のミドルウェア機能に移行するよう指示します。 Connectには、on githubが表示される一連のミドルウェアモジュールが付属しています。ミドルウェアは必要なものを何でも行うことができます。たとえば、JSONリクエスト本体を解析し、対応する静的ファイルを検索してファイルシステムを検索し、セッションCookieをチェックし、ログファイルにログするなどの処理を行います。この設計により、コードを再利用するだけでなく、別々のミドルウェア機能を新しい組み合わせで組み合わせることも簡単にできます。ミドルウェアの機能の中には、要求の解析と処理を扱うものもあれば、応答を生成するものもあります。通常、リクエスト処理(解析、ロギング、デコード、変換など)を多く行う既存のミドルウェア機能を見つけることができます。また、独自のミドルウェアを用意して実際にレスポンスをレンダリングします。

+0

ありがとう。 'next()'の使い方は、yonran(下記参照)とは多少異なります。つまり、ミドルウェアがタスクを完了できない場合、 'next(error)'が呼び出されます。 – Randomblue

+0

@yonranはおそらく正しいでしょう。エクスプレスガイドでは、権限のないリクエストの場合には 'next(error)'を呼び出します。おそらくそれが良いでしょう。私は私の答えを編集します。 –

関連する問題