2013-02-16 17 views
21

Próbuję zaimplementować permalinki w postaci /2013/02/16/title-with-hyphens. Chciałbym użyć parametrów trasy. Gdy próbuję następującą trasę:Jak mogę zezwolić na ukośniki na moich trasach ekspresowych?

app.get('/:href', function(req, res) { }); 

... potem dostaję 404, przypuszczalnie dlatego Express patrząc tylko dla jednego parametru, i uważa, że ​​istnieją 4.

mogę obejść się /:y/:m/:d/:t, ale to zmusza moje permalinki do trwałej formy.

Jak ustawić parametry trasy tak, aby zawierały ukośniki?

Odpowiedz

24

Użyj wyrażenia regularnego zamiast ciągu.

app.get(/^\/(.+)/, function(req, res) { 
    var href = req.params[0]; // regexp's numbered capture group 
}); 

Należy pamiętać, że nie można używać składni ciągu (app.get('/:href(.+)')), ponieważ Express umożliwia tylko niewielki podzbiór wyrażeń regularnych w ciągi tras i używa tych wyrażeń regularnych jako test warunkowego dla że danego składnika trasy. Nie przechwytuje dopasowanej treści w trybie warunkowym, ani nie pozwala na dopasowanie elementów (części adresu URL oddzielone ukośnikami).

Na przykład:

app.get('/:compa([0-9])/:compb([a-z]/') 

Trasa ta pasuje tylko jeśli pierwszy składnik (Compa) jest pojedynczą cyfrą, a drugi składnik (compb) jest pojedynczą literą A-Z.

mówi "dopasuj pierwszy komponent tylko, jeśli treść jest cokolwiek", co nie ma większego sensu; to jest domyślne zachowanie. Dodatkowo, jeśli przeanalizujesz the source, zobaczysz, że Express wymusza na kropce pod tym warunkiem, że jest dosłowny.

Na przykład app.get('/:href(.+)') faktycznie kompiluje się:

/^\/(?:(\.+))\/?$/i 

zauważyć, że . została uciekł, więc ta trasa będzie tylko dopasować jedną lub więcej okresów.

1

Można to zrobić z regex routingu

app.get('/:href(\d+\/\d+\/\d+\/*)', function(req, res) { }); 

ja nie wiem, czy wyrażenie regularne ma rację, ale masz pomysł

EDIT:

I nie sądzę powyżej prac, ale to robi

app.get(/^\/(\d+)\/(\d+)\/(\d+)\/(.*)/, function(req, res) { }); 

Idąc do http://localhost:3000/2012/08/05/hello-i-must-be yeilds req.params = [ '2012', '08', '05', 'hello-i-must-be' ]

+0

Próbuję 'app.get ('/: href (. +)', ...' bez powodzenia Co ja brakuje? –

+0

Nie sądzę, że można przekazać wyrażenie regularne wewnątrz ciągu trasy Musisz przekazać obiekt regexp, zobacz [moja odpowiedź] (http://stackoverflow.com/a/14915608/201952). – josh3736

+0

To: http://stackoverflow.com/a/12334009/8446 oznacza, że może ... –

23

Wygląda na to, że app.get("/:href(*)", ...) działa dobrze (przynajmniej w Express 4). Otrzymasz swoją wartość parametru w req.params.href.

Zostanie również wyrzucony z trasy /, co prawdopodobnie nie jest tym, czego potrzebujesz. Możesz tego uniknąć, ustawiając app.get('/', ...) w innym miejscu swojej aplikacji lub wyraźnie sprawdzając pusty ciąg.

Powiązane problemy