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