4

私は node.js から始めて、単純な MVC フレームワークを作成しています。これまでのところ、フロント コントローラー (または「ディスパッチャー」) が動作しています。ルーティングは、示されているように、ディスパッチャー構成モジュールを介して行われます。

私の質問は、コードの直後の最後にあります。また、これはノードを学習するための演習です。express.js などを提案しないでください。

dispatcherConfig.js :

var url = require('url');

(function() {
    var dispatcherConfig = {
        '/'                 : 'homeController',
        '/index.html'       : 'homeController',
        '/sayHello.html'    : 'helloController',
        '404'               : '404Controller'
    };

    module.exports.getController = function(request) {
        var route = url.parse(request.url, true).pathname;
        if(dispatcherConfig[route]) {
            return dispatcherConfig[route];
        }
        return dispatcherConfig['404'];
    }
}());


これは、dispatcher.jsによって使用されます。

var dispatcherConfig = require('./config/dispatcherConfig');

(function() {
    module.exports.dispatch = function(request, response) {
        var requiredController = dispatcherConfig.getController(request);
        var controller = require('./controllers/' + requiredController);
        controller.doService(request, response);
    }
}());


そして、これがサンプルコントローラーの外観です(うまく機能します) - homeController.js:(
今のところインラインビューコードは無視してください)

(function() {
    var homeController = {
        doService: function(request, response) {
            response.write('<form action="/sayHello.html" method="GET">' + 
                '<input id="name" name="name" size="20" />' + 
                '<input type="submit" value="Submit" />' + 
                '</form>');
        }
    }

    module.exports.doService = function(request, response) {
        return homeController.doService(request, response);
    }
}());


このルーティングはうまく機能します。URLパターンに簡単に接続できるコントローラーがあり、リクエストオブジェクトをさらに検査することで、Springのマルチアクションコントローラータイプもエミュレートしています。

ここで実行する必要がある 3 つの明白な事柄は次のとおりです。

  1. ビュー オブジェクトの作成
  2. モデル オブジェクトの作成
  3. ビューとモデルのバインディング


質問:

  1. MVC (少なくとも春) では、ビューをモデルにバインドするのはコントローラーです。これが最善の方法ですか?どのビューがどのモデルにバインドされているかを説明する別の構成を個別に維持し、コントローラーがビューにのみルーティングするとどうなりますか。これは間違っていて、MVC ではありませんか?

  2. node.jsでビューを表現する良い方法は何ですか? テンプレートベースが多いため、どのようなテンプレートオプションが提供されていますか (成熟したもの)?

  3. 静的に提供されるファイルをロードすると (たとえば、メモリに読み取られたファイルを介してロードされる CSS ファイル)、グローバル/アプリ スコープ内のコンテンツへの参照を保持すると、後続の要求はメモリから直接提供され、驚異的な結果が得られます。速度、この仮定は正しいですか? 実際、最初のリクエストがノード サーバーに入力された後 (ファイルの読み取りとコンテンツのメモリへのロードがトリガーされます)、後続のすべてのリクエストがメモリから処理されることを保証できます (このような静的コンテンツの場合)。

  4. 生のnode.jsでPOSTデータを取得する低レベル(フレームワークなし)の方法は何ですか?

ありがとう。

4

2 に答える 2

9

タイトルの質問に答えるために、これが私に説明してもらった方法です。

コントローラーはルーターであり、着信要求を受け取り、それらをビジネス ロジック (データのフェッチを含む) およびレンダリング メソッドと組み合わせて、キューから吐き出します。メールソーターか何かと考えてください。「ここに住所があり、ビンがあります」。

ビューはばかげているはずです。データを取得してスロットに詰め込み、テーブルのループを実行し、他のビューを含めることになっていますが、それだけです。HTML をレンダリングします。さらに優れているのは、XML や JSON の出力、または単に生データをクライアントに「レンダリング」する「ビュー」です。(すべてのビュー)

モデルは、入ってくるデータやデータベースからの結果を処理する場所であるため、注意が必要な部分です。したがって、ここには多くの「レイヤー」が存在する可能性があり、実際には多くのネストされた呼び出しを行う可能性があります。これは、サニティ チェックを超えて入力を検証する場所であり (失敗した場合は、適切なキャリア メッセージをコントローラーに返します)、格納前に前処理し、データベースから出力されたものを後処理します。これは、ロジックが存在する場所です。

ここに問題があります。私たちはモノリシックに物事を行うのではなく、意図したことを呼び出しています。したがって、特定のコントローラーを呼び出すことで、既にいくつかの情報をセマンティックに指定したことになります (このため、セマンティック Web と呼ばれる理由を参照してください)。

そのため、コントローラーをより愚かにする余裕があります (呼び出し元は意図を知っています)。モデルをより馬鹿げたものにする余裕があります (コントローラーの特定のビットのビジネス ロジックとストレージを処理します)。そして、ビューは常に愚かでした。

これは、1 つのモデル クラスを非常に大きくできないと言っているわけではありません。しかし、個々のコントローラーが呼び出すべき部分は狭いはずです。

その他のリクエスト:

MVC (少なくとも春) では、ビューをモデルにバインドするのはコントローラーです。これが最善の方法ですか?どのビューがどのモデルにバインドされているかを説明する別の構成を個別に維持し、コントローラーがビューにのみルーティングするとどうなりますか。これは間違っていて、MVC ではありませんか?

上記を参照してください。これについてはすでに説明したと思います。コントローラーは、意味的に必要なものに基づいて特定のことを行うように要求されます。コントローラーはモノリシックな switch ステートメントではないため、コントローラー内で多くの構成を行う必要はありません。

node.jsでビューを表現する良い方法は何ですか? テンプレートベースが多いため、どのようなテンプレートオプションが提供されていますか (成熟したもの)?

「ビューを表す」?ビュー エンジンは独自にマッチングを行います。独自のビュー エンジンを作成しますか? それはできます。ビューファイルをトークン化し、「制御動詞」を見つけ (より適切な名前がないため、あると確信しています)、そこにデータを挿入し、トークン化された構造全体を文字列としてレンダリングします (HTML は本質的に文字列です。 ?)。一言で言えば、それだけです。私のアドバイスは、ビューの人々にビューの仕事をさせてください。すべてを書き直す必要はありません。

静的に提供されるファイルをロードすると (たとえば、メモリに読み取られたファイルを介してロードされる CSS ファイル)、グローバル/アプリ スコープ内のコンテンツへの参照を保持すると、後続の要求はメモリから直接提供され、驚異的な結果が得られます。速度、この仮定は正しいですか? 実際、最初のリクエストがノード サーバーに入力された後 (ファイルの読み取りとコンテンツのメモリへのロードがトリガーされます)、後続のすべてのリクエストがメモリから処理されることを保証できます (このような静的コンテンツの場合)。

それは正しい仮定です。これは、一般的なガベージ コレクション ルーチンを使用して、数分ごとにチェックし、n 分より古いファイルを細断処理してから、後続の要求でリロードして、比較的最近のファイルを取得していることを確認する方法です。しかし、これは事実上キャッシング プロキシが行うことなので、はい、それはまったく問題ありません。

生のnode.jsでPOSTデータを取得する低レベル(フレームワークなし)の方法は何ですか?

あなたはそうしない。ノードがこれを行います。すでにリクエストオブジェクトに表示されています。

于 2012-06-16T06:34:52.027 に答える
0

ノードで使用されている最も一般的なテンプレート エンジンは、Jade と EJS です。これは主に、Express にこれらのサポートが組み込まれているためです。Express を使用しない場合は、Mustache も真剣に検討します (個人的には、Jade/EJS よりも Mustache の哲学の方が好きです)。

于 2012-06-17T12:59:48.093 に答える