まず第一に、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 にコントローラーを含めることは技術的には可能かもしれませんが、最終的にはミドルウェアと同じフロー制御構造を使用することを余儀なくされるでしょう。