2012-04-05 12 views
5

Utilizzo Express JS e voglio una funzionalità simile alla funzione reverse di Django. Quindi, se ho un percorso, ad esempioPercorso URL inverso JS espresso (stile Django)

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

mi piacerebbe utilizzare una funzione, ad esempio

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

o meglio ancora

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

che mi darà l'url /users/15/John . Esiste una tale funzione? E se no, allora hai qualche idea su come scrivere tale funzione (considerando l'algoritmo di routing Express)?

risposta

7

Ecco il codice:

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

ho pensato a qualcosa di simile (e in realtà ho fatto realizzare questo semplice caso), ma unfortunetly Express utilizza '' come un carattere speciale?. Ciò rende le cose un po 'più complicate, perché per url '/ users /: id?' Sia'/users' che '/ users/1' lo corrispondono. – freakish

+0

Aggiornato. E 'questo quello che vuoi? – cababunga

+0

Sì, penso che farà il lavoro. Grazie! – freakish

5

Ho appena creato il pacchetto reversable-router che risolve questo insieme di altri problemi per il routing.

Esempio dal 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})