8

我还在纠结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();
});

这基本上接受来自 API 的所有调用并以正确的 api 控制器为目标。或者,我可以单独声明每个路由,或者甚至编写一个循环,通过我的每个控制器并在初始化时声明它们。所以:

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 文件夹结构,所以代码比上面的要复杂一些。但你明白了。

我想知道两者的后果是什么以及它是否真的很重要?

谢谢!

4

3 回答 3

6

我根本不会推荐一个 app.js。你最终会得到一个超过 5,000 行的文件,这对维护来说是一场噩梦。

我在您的代码段中看到的最大问题是,即使 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){});

};
于 2012-05-20T19:20:34.807 回答
3

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

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

如果我们有问题或遗漏了什么,我们很乐意提出建议/请求。

于 2012-05-20T18:22:55.073 回答
0

我认为遍历目录树并生成路由应该没有任何真正的问题。但是,很难以一种好的方式定义基于路由的中间件和其他路由功能(例如路由中的变量)。

我编写了一个库,我用它来声明式地定义我的路由,并且您可能会感兴趣的重复最少。它的灵感来自 Rails 资源丰富的路由,并且非常灵活 - 其想法是构建路由和子路由的哈希;还有一些工具可以定义路由组、中间件和变量。

https://github.com/cheesun/express-declarative-routing

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

于 2014-03-08T04:47:35.537 回答