2012-04-05 75 views
5

我使用Express JS,我想要一个类似于Django的reverse函数的功能。所以,如果我有一个途径,例如Express JS反向URL路由(Django风格)

app.get('/users/:id/:name', function(req, res) { /* some code */ }) 

我想使用的功能,例如

reverse('/users/:id/:name', 15, 'John'); 

甚至更​​好

reverse('/users/:id/:name', { id : 15, name : 'John' }); 

,这将给我的网址/users/15/John 。这样的功能是否存在?如果没有,那么你有什么想法如何写这样的功能(考虑Express的路由算法)?

回答

7

这里是你的代码:

function reverse(url, obj) { 
    return url.replace(/(\/:\w+\??)/g, function (m, c) { 
     c=c.replace(/[/:?]/g, ''); 
     return obj[c] ? '/' + obj[c] : ""; 
    }); 
} 

reverse('/users/:id/:name', { id: 15, name: 'John' }); 
reverse('/users/:id?', { id: 15}); 
reverse('/users/:id?', {}); 
+0

我想过这样的事情(和我其实实现这个简单的例子),但偏偏Express使用''作为特殊字符?这会让事情变得更复杂一些,因为对于'/ users /:id?','/ users'和'/ users/1'都是匹配的。 – freakish 2012-04-05 18:08:13

+0

已更新。那是你要的吗? – cababunga 2012-04-05 19:11:32

+0

是的,我认为这将会完成这项工作。谢谢! – freakish 2012-04-05 21:55:33

5

我刚刚创建了沿着路由等问题解决了这个包reversable-router。自述

例子:

app.get('/admin/user/:id', 'admin.user.edit', function(req, res, next){ 
    //... 
}); 

//.. and a helper in the view files: 
url('admin.user.edit', {id: 2})