我想就这是否是使用 Node.js 和 Express.js 实现/增强 MVC 模式的好方法提出意见/建议
1)我正常初始化应用程序,但在这个阶段我调用了一个我命名的函数routeRegistrar
,如下:
var
express = require('express'),
routeRegistrar = require('./routeRegistrar'),
var app = express.createServer();
configureApp(app);
routeRegistrar(app); //note this line
app.listen(3000, function(){
console.log("App started");
});
function configureApp(app){
app.configure(function(){
//configuration stuff with app variable
});
}
2)我采用的约定是每个控制器都将放置在一个名为 的目录Controllers
中,并且每个控制器都由一个包含一个或多个动作的模块构成,exports
按照上述约定作为对象推送到变量:
{ method: 'GET', url: '/example', action: function(req, res){ } }
因此,通过这种方式,我可以自动化路由注册过程,并使方法/url 靠近处理请求的代码(我认为它更易于阅读/维护)。所以代码routeRegistrar
如下:
var fs = require('fs');
module.exports = function(app){
fs.readdirSync(__dirname + '/controllers').forEach(function(controllerName){
var controller = require("./controllers/" + controllerName);
for (var actionName in controller) {
var action = controller[actionName];
app[action.method](action.url, action.action);
}
});
}
简单的 indexController 看起来像这样:
exports.index = {
url: "/",
method: "get",
action: function(req, res){
res.render('index');
}
}
恕我直言,我相信每次我想要注册一个新的控制器/路由时,这是一个更好的方法,我必须
1- 打开 app.js 2- 在顶部放置另一个要求行 3- 编写类似的代码app.get('/index', indexController.index);
请让我知道这是否是继续项目的好方法,我想听听您的意见和建议。
编辑: 基于 Tyrsius 的回答和缺乏其他意见,我将使用他的方法进行一些修改:
routeRegistrar.js
var fs = require('fs');
module.exports = function(app){
fs.readdirSync(__dirname + '/controllers').forEach(function(controllerName){
var controller = require("./controllers/" + controllerName);
for (var actionName in controller) {
controller[actionName](app);
}
});
};
indexController.js
module.exports.index = function(app){
app.get("/", function(req, res){
res.send("New approach!");
});
};