express.js为您提供了一个不错的裸系统来实现标准的MVC开发模式。然而,我看过的大多数教程都在路由文件或全局应用程序文件中应用控制器逻辑。
理想世界:
模型-管理基本行为和数据
控制器-向模型和视图发送命令
查看-渲染来自模型的数据
目前我有以下几种:
routes/index.js-指向动作的路由
router.get('/hotels', function(req, res, next) {
hotels.run(req, res, next);
next();
});
controllers/hotels.js-控制器向模型发送命令
module.exports = {
run: function(req, res, next) {
var users = new require('../models/hotels');
users.run(function(callback) {
res.render('hotels', { title: 'Hotels page', users: callback });
});
}
}
models/hotel.js-请求数据的模型
module.exports = {
run: function(callback) {
connection.query(sql, function(err, rows, fields) {
callback(rows);
//console.log(rows);
});
}
}
无论我尝试什么,我都无法从模型中获得数据,然后返回到控制器,再传递到视图。我知道上面的代码中可能有多个错误,因为我是新手。但基本面应该是好的,我希望我不能返回模型数据的原因是显而易见的,因为除了回调之外,上面的所有逻辑都是有效的。
如果人们希望在express.js项目中使用类似的MVC方法,我相信我已经解决了这个问题。
routes.js-已更改以匹配Kevin的清洁方法。
router.get('/hotels', hotels.run);
controller/hotels.js-
module.exports = {
run: function(req, res, next) {
var users = new require('../models/hotels');
users.run(function(err, callback) {
res.render('hotels', { title: 'Hotels page', users: callback });
});
}
}
models/hotel.js
module.exports = {
run: function(callback) {
connection.query(sql, function(err, rows, fields) {
callback(err, rows);
});
}
}
因此,现在模型根据控制器的请求返回查询,使控制器能够将数据传递给视图。