Model view controller Node.js、restify和正确的路由

Model view controller Node.js、restify和正确的路由,model-view-controller,node.js,express,restify,Model View Controller,Node.js,Express,Restify,我仍然在思考这个节点,但我有一个非常简单的问题。我看到很多节点示例,其中人们在单个app.js文件中声明他们的路由和所有逻辑(或者有时将它们拆分为子文件) 我的问题基本上是:在应用程序中保留所有路由声明还是引导一个映射到文件结构的通用路由更好。这似乎是一个原始的问题,但我的目标是掌握节点中什么是最有效的 我目前正在使用Restify构建一个API处理程序,但我有另一个使用Express的应用程序(所以这个问题可能会回答这两个问题) 在我的路径中,我可以声明一个单路径引导,如下所示: app.al

我仍然在思考这个节点,但我有一个非常简单的问题。我看到很多节点示例,其中人们在单个app.js文件中声明他们的路由和所有逻辑(或者有时将它们拆分为子文件)

我的问题基本上是:在应用程序中保留所有路由声明还是引导一个映射到文件结构的通用路由更好。这似乎是一个原始的问题,但我的目标是掌握节点中什么是最有效的

我目前正在使用Restify构建一个API处理程序,但我有另一个使用Express的应用程序(所以这个问题可能会回答这两个问题)

在我的路径中,我可以声明一个单路径引导,如下所示:

app.all('/api/:package/:controller', function(request, response) {
    var controller = require(
        '../' + request.params.package + '/api/' + request.params.controller
    );
    controller.index(request, response);
    response.end();
});
这基本上接受来自API的所有调用,并以适当的API控制器为目标。或者,我可以单独声明每个路由,或者甚至编写一个循环,遍历我的每个控制器,并在init上声明它们。因此:

for (var i in packages.controllers) {
    app.all('api/' + package + '/' + controllers[i].name, function(request, response) {
       var controller = require(
           '../' + request.params.package + '/api/' + request.params.controller
       );
       controller.index(request, response);
    }
}
packages.controllers是所有可能控制器的数组。注意上面的代码不准确,我有一个HMVC文件夹结构,所以代码比上面的要复杂一些。但你明白了

我想知道这两者的后果是什么,是否真的很重要


谢谢

爆炸性的app.js文件促使我们两人创建了一个小的参考应用程序,以编写标准的Express应用程序结构。这不是火箭科学,而是一套使事情更有条理的惯例

你可以在这里找到它:


如果我们有什么地方出错或遗漏,我们希望得到建议/请求。

我不会推荐一个app.js。您将得到一个5000多行的文件,这是一个需要维护的噩梦

我在代码段中看到的最大问题是,即使require()被缓存,它也必须执行同步IO请求。这只是一个坏习惯

与Don的建议类似,我很幸运地将路由拆分为模块,这些模块导出一个接受应用程序实例的函数。您可以将其视为“装饰”应用程序实例:

// app.js
var app = express.createServer();
app.configure(function(){ //... });

require('./foo')(app);

// foo.js
exports = module.exports = function(app){

    app.get('/whatever', function(req, res){});

};

我认为在目录树中循环并生成路由不会有任何实际问题。然而,很难用一种好的方式定义基于路由的中间件和其他路由特性(例如路由中的变量)

我编写了一个库,我使用它以声明的方式定义我的路线,并尽可能减少您可能感兴趣的重复。它的灵感来自Rails资源丰富的路由,并且非常灵活——其思想是构建路由和子例程的散列;还有一些工具可以定义路由组、中间件和变量


虽然它不会根据您的目录结构自动生成路由,但我认为这是一个很酷的功能,欢迎您将其添加到库中。

谢谢Don,这是一个有趣的样板文件。然而,我想我的主要问题还没有解决。在应用程序中,您将在routes.js中明确定义每个路由。我想自动生成它,这样我就不必手动定义路线。神奇的东西往往会吓到我:)我们使用routes.js b/c,这是明确的。它可以很容易地看到声明了哪些路由匹配,而不会用impl代码污染它。嗯,我明白了,但它仍然要求我在app.js中显式注册每个路由。我不喜欢这样做,我希望应用程序根据我的文件结构自动生成路由。我想我正在寻找一个解析文件结构并在node.js启动时生成路由的解决方案。然后,所有路由和模块都将存储在内存中(因此不存在同步问题)。基本上,我正在学习第二段代码。我认为,它将循环通过我所有的控制器,需要控制器并将它们存储在内存中。我认为这是有道理的…哈哈。