16

高速ルートを介して従来のコントローラーと異なる、またはより強力なものはありますか?

Express アプリがあり、モデルを定義する場合、それは MVC アプリケーションになりますか、それとも他に必要なものがありますか?

より正当な「コントローラー」にアップグレードしないことで、ノードエクスプレスアプリの追加/簡単な機能を見逃しているのではないかと思っています。そんなことあるなら。

ありがとう!

編集:明確にするために、次のようなルートを使用する場合:

// routes/index.js
exports.module = function(req, res) {
  // Get info from models here, 
  res.render('view', info: models);
}

コントローラーと何が違うの?コントローラーはもっと多くのことができますか?

4

1 に答える 1

19

まず第一に、Express のルートは connect で定義されているミドルウェアです。エクスプレス フレームワークと他のフレームワークの違いは、ミドルウェアがほとんどコントローラーの前にあり、コントローラーが応答を終了することです。Express がミドルウェアを使用するもう 1 つの理由は、Node.js が非同期であるという性質によるものです。

コントローラが JavaScript でどのように見えるか見てみましょう。

var Controller = function () { };

Controller.prototype.get = function (req, res) {

  find(req.param.id, function (product) {

    res.locals.product = product;

    find(res.session.user, function (user) {

      res.locals.user = user;
      res.render('product');

    }); 

  }); 

};  

この get アクションについておそらく最初に気付くのは、ネストされたコールバックです。これはテストが難しく、読みにくく、編集する必要がある場合はインデントをいじる必要があります。フロー制御を使用してこれを修正し、フラットにします。

var Controller = function () { };

Controller.prototype.update = function (req, res) {

  var stack = [

    function (callback) {

      find(req.param.id, function (product) {
        res.locals.product = product;
        callback();
      });


    },

    function (callback) {

      find(res.session.user, function (user) {
        res.locals.user = user;
        callback();
      });

    }

  ];

  control_flow(stack, function (err, result) {
    res.render('product');
  });

}

この例では、スタックのさまざまな機能をすべて抽出してテストしたり、さまざまなルートに再利用したりすることもできます。制御フローの構造がミドルウェアによく似ていることに気付いたかもしれません。それでは、ルートのスタックをミドルウェアに置き換えましょう。

app.get('/',

  function (req, res, next) {

    find(req.param.id, function (product) {
      res.locals.product = product;
      next();
    });

  },

  function (req, res, next) {

    find(res.session.user, function (user) {
      res.locals.user = user;
      next();
    });

  },

  function (req, res, next) {
    res.render('product');
  }

);

そのため、express.js にコントローラーを含めることは技術的には可能かもしれませんが、最終的にはミドルウェアと同じフロー制御構造を使用することを余儀なくされるでしょう。

于 2012-10-18T15:03:20.010 に答える