2012-10-17 15 views
8

伝統的なコントローラーとは異なる、あるいはより強力なものがありますか?node.jsエクスプレスルートとコントローラの違いは何ですか?

エクスプレスアプリがありモデルを定義している場合、それはMVCアプリケーションになるのですか、それとも必要ですか?

もっと正当な 'コントローラ'にアップグレードしないことでノードエクスプレスアプリの余分な/簡単な機能を逃しているのではないかと思っています。そんなことがあれば。

ありがとうございます!

編集:あなたがそうのようなルートを使用する場合は、明確にする:

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

コントローラから、それはどんな違うのは何?コントローラーはもっと機能することができますか?

答えて

10

まず、expressのルートはconnectで定義されているミドルウェアです。 Expressフレームワークと他のフレームワークの違いは、ミドルウェアが主にコントローラの前に位置し、コントローラが応答を終了することです。 Expressがミドルウェアを使用するもう一つの理由は、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'); 

    }); 

    }); 

}; 

最初に気付くのは、ネストされたコールバックです。これはテストするのが難しく、読みにくく、編集する必要がある場合は、インデントをしなければなりません。したがって、フロー制御を使用してこれを修正し、フラットにします。

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にコントローラを持つことが可能かもしれませんが。

関連する問題