如何优化Express.JS中的路由?

时间:2011-12-03 12:24:44

标签: node.js express

我有很多路线,如:

app.all('/:controller', controller.init());
app.all('/:controller/:action', controller.init());
app.all('/:controller/:action/:par1', controller.init());
app.all('/:controller/:action/:par1/:par2', controller.init());
app.all('/:controller/:action/:par1/:par2/:par3', controller.init());

我可以一次优化这些路线吗?

3 个答案:

答案 0 :(得分:6)

不,你不能。这不是你应该如何做路由。路线应该很好地定义为有明智的uris。

例如我手写了以下路线

app.get(“/ blog”,controller.index);

app.get("/blog/new", controller.renderCreate);
app.get("/blog/:postId/edit", controller.renderEdit);
app.get("/blog/:postId/:title?", controller.view);
app.post("/blog", controller.createPost);
app.put("/blog/:postId", controller.updatePost);
app.del("/blog/:postId", controller.deletePost);

这意味着您可以完全控制所需的URI。

强烈建议您手动定义您想要的uris并将它们连接到您想要的任何控制器对象。

这意味着你的uris保持漂亮,语义和完全控制。

答案 1 :(得分:1)

目前我正在尝试通过执行以下操作来获取类似ASP.NET MVC路由的路由:

app.all('*', function(req, res) {
//extract the route into an array
var m_path = req.route.params.toString().split('/');    
//require for a module with a dynamic name based on path info
var controller = require('./controllers/' + m_path[1] + '.js'); 
//build a method name
var fname = req.route.method + (m_path[2] || 'Index');  
//if a exported method exists on the module, then use it, otherwise, create a new function
var func = controller[fname] || function (){
    //maybe use a 404
    res.send('controller/method not found: ' + fname);
    };  
//invoke the function
func.call(this, req, res);  
});

在这个例子中,我有一个名为controllers的文件夹。然后我将所有控制器放在该文件夹中。然后我可以这样做:

路线:/ users /

js:controllers / users.js

//template: GET /users/
module.exports.getIndex = function(req, res) {  
    res.send('get on index');
};

//template: POST /users/index
module.exports.postIndex = function(req, res) { 
    res.send('post on index');
};

//template: PUT /users/index
module.exports.putIndex = function(req, res) {  
    res.send('put on index');
};

//template: GET /users/custom
module.exports.getCustom = function(req, res) { 
    res.send('get on custom');
};

答案 2 :(得分:0)

我稍微修改了Jone Polvera的答案以使用正则表达式:

app.all(/^(.+)\/(.+)/, function(req, res) {    
    var controller = require('./routes/' + req.params[0] + '.js');
    var fname = req.params[1];   
    var func = controller[fname] || function () {        
        res.send('controller/method not found: ' + fname);
    };
    func.call(this, req, res);
});

我有一个名为routes的文件夹。然后在路线中我有一个名为admin.js的文件:

exports.posts = function(req, res) {
...
}

所以URL / admin / posts会在那里路由。