Node.js,restify和正确的路由

我仍然围绕着Node,但是我有一个非常简单的问题。 我看到很多节点的例子,人们在一个app.js文件中声明它们的路线和所有的逻辑(有时把它们分解成子文件)。

我的问题基本上是:在应用程序中保留所有路由声明还是引导映射到文件结构的通用路由最好。 这可能看起来像一个原始的问题,但我的目标是要掌握节点内最有效的。

我目前正在使用Restify构buildAPI处理程序,但是我有另一个使用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文件促使我们几个人创build了一个小型参考应用程序来编写标准的Express应用程序结构。 这不是火箭科学,而是一套使事情更有条理的传统。

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

如果出现错误或缺失的情况,我们很乐意提供build议/拉取请求。

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

我看到的最大的问题是,即使require()被caching,它也必须执行同步IO请求。 进入这只是一个坏习惯。

类似于Don的build议,我已经把路线分成了几个模块,最好的方式是导出一个接受应用程序实例的函数。 您可以将其视为“装饰”应用程序实例:

 // 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){}); }; 

我不认为循环目录树和生成路由应该有任何问题。 但是,很难以很好的方式定义基于路由的中间件和其他路由function(例如路由中的variables)。

我写了一个库,我用它来声明性地定义我的路由,并且可能会感兴趣的是最less的重复。它受Rails资源路由的启发,并且非常灵活 – 想法是构build路由和子路由的散列; 还有定义路由组,中间件和variables的设施。

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

虽然它不会根据您的目录结构自动生成路线,但我认为这将是一个很酷的function,欢迎您将其添加到图书馆。