Node.js,改进和正确的路由

pil*_*guy 8 model-view-controller node.js express restify

我仍然围绕着Node,但我有一个非常简单的问题.我看到很多节点示例,人们在一个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();
});
Run Code Online (Sandbox Code Playgroud)

这基本上接受来自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);
    }
}
Run Code Online (Sandbox Code Playgroud)

packages.controllers是所有可能的控制器的数组.注意上面的代码不准确,我有一个HMVC文件夹结构,所以代码比上面的要复杂一点.但你明白了.

我想知道其中任何一个的后果是什么,以及它是否真的重要?

谢谢!

gjo*_*son 6

我根本不推荐单个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){});

};
Run Code Online (Sandbox Code Playgroud)


Don*_*Don 3

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

您可以在这里找到它: https: //github.com/EAAppFoundry/tableau

如果我们出错或遗漏了某些内容,我们很乐意提供建议/拉取请求。