在快速路线上,传统控制器有什么不同或更强大的功能吗?
如果您有快速应用程序并定义模型,它是否成为MVC应用程序,还是更有必要?
我只是想知道我是否因为没有升级到更合法的“控制器”而错过我的节点快递应用中的额外/更简单的功能。如果有这样的事情。
谢谢!
编辑:澄清一下,如果你使用这样的路线:
// routes/index.js
exports.module = function(req, res) {
// Get info from models here,
res.render('view', info: models);
}
是什么让它与控制器有什么不同?控制器能够做得更多吗?
答案 0 :(得分:13)
首先,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中有控制器,但您可能会被迫使用流控制结构,最终与中间件相同。