2012-04-05 28 views
5

Tôi đang sử dụng Express JS và tôi muốn có một chức năng tương tự như chức năng reverse của Django. Vì vậy, nếu tôi có một lộ trình, ví dụExpress JS tuyến đường URL ngược (kiểu Django)

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

Tôi muốn sử dụng một chức năng ví dụ

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

hoặc thậm chí tốt hơn

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

mà sẽ cung cấp cho tôi những url /users/15/John . Chức năng này có tồn tại không? Và nếu không thì bạn có bất kỳ ý tưởng làm thế nào để viết chức năng như vậy (xem xét thuật toán định tuyến Express)?

Trả lời

7

Đây là mã của bạn:

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

Tôi nghĩ về một cái gì đó như thế này (và thực sự tôi đã thực hiện trường hợp đơn giản này), nhưng unfortunetly Express sử dụng '' như một nhân vật đặc biệt không?. Điều này làm cho mọi thứ trở nên phức tạp hơn một chút, bởi vì đối với url '/ users /: id?' Cả '/ users' và'/users/1' khớp với nó. – freakish

+0

Đã cập nhật. Đó là điều bạn muốn? – cababunga

+0

Vâng, tôi nghĩ rằng sẽ thực hiện công việc. Cảm ơn! – freakish

5

tôi vừa tạo gói reversable-router rằng giải quyết này cùng các vấn đề khác cho định tuyến.

Ví dụ từ readme:

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}) 
Các vấn đề liên quan