2

我想就这是否是使用 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!");
    });
};
4

1 回答 1

4

这不是一个糟糕的解决方案,但我认为为路由创建自己的语法会令人困惑。从长远来看,能够使用与 Node/Express 相同的路由语法将对您有所帮助。当你去一个新项目时,你不会不熟悉它,并且你将能够寻求帮助,因为你将使用其他人都使用的语法。

我使用类似的解决方案,它看起来像这样。它会在启动时抓取目录中的每个 .js 文件/routes,因此您可以添加控制器而无需更改任何代码。

在 app.js 中

// Routes
require('./routes')(app);

路线/index.js

var fs = require('fs');

module.exports = function(app){

    //GET home page
    app.get('/', function(req, res){        
        res.render('index');
    });

    //Load other controllers/routes
    fs.readdirSync(__dirname).forEach(function(file) {
        if (file == "index.js") return;
        //var name = file.substr(0, file.indexOf('.'));
        require(__dirname + '/' + file)(app);
    });
};

示例路由/控制器:

module.exports = function(app){

   app.post('/login', function(req, res){
        //stuff
    });

    //other actions on this route
};
于 2012-07-25T16:30:36.157 回答