首先,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');
});
});
};
关于此 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 中可以有控制器,但您可能会被迫使用流控制结构,这最终与中间件相同。