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文件夹结构,所以代码比上面的要复杂一点.但你明白了.
我想知道其中任何一个的后果是什么,以及它是否真的重要?
谢谢!
我根本不推荐单个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)
爆炸性的 app.js 文件促使我们创建了一个小型参考应用程序来编写标准 Express 应用程序结构。这不是复杂的科学,而是一套让事情变得更有条理的惯例。
您可以在这里找到它: https: //github.com/EAAppFoundry/tableau
如果我们出错或遗漏了某些内容,我们很乐意提供建议/拉取请求。