2012-04-05 10 views
5

Ich benutze Express JS und möchte eine ähnliche Funktionalität wie Djangos reverse-Funktion. Also, wenn ich eine Route, zum BeispielExpress JS umgekehrte URL-Route (Django-Stil)

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

würde Ich mag eine Funktion zum Beispiel besser

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

oder sogar

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

verwenden, das gibt mir die URL /users/15/John . Gibt es eine solche Funktion? Und wenn nicht, haben Sie irgendwelche Ideen, wie man solche Funktionen schreibt (unter Berücksichtigung des Routing-Algorithmus von Express)?

Antwort

7

Hier ist der Code:

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

Ich dachte an so etwas wie diese (und eigentlich habe ich diesen einfachen Fall implementieren), aber unfortunetly Express nutzt '' als Sonderzeichen?. Das macht die Sache etwas komplizierter, weil für URL '/ users /: id?' Sowohl '/ users' als auch'/users/1' übereinstimmen. – freakish

+0

Aktualisiert. Ist es das was du willst? – cababunga

+0

Ja, ich denke, das wird den Job machen. Vielen Dank! – freakish

5

Ich habe gerade das Paket reversable-router erstellt, die diese entlang anderer Probleme für das Routing löst.

Beispiel aus der 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})