2013-02-16 6 views
21

Sto tentando di implementare i permalink, nella forma /2013/02/16/title-with-hyphens. Mi piacerebbe usare i parametri del percorso. Se provo il seguente itinerario:Come posso consentire le barre nelle rotte Express?

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

... poi ho un 404, presumibilmente perché espresso solo è alla ricerca di un parametro, e pensa che ci sono 4.

posso lavorare intorno ad esso con /:y/:m/:d/:t, ma questo costringe i miei permalink a essere di quella forma in modo permanente.

Come si ottengono i parametri del percorso per includere le barre?

risposta

24

Utilizzare un'espressione regolare anziché una stringa.

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

Notare che non è possibile utilizzare la sintassi della stringa (app.get('/:href(.+)')) perché Express consente solo un piccolo sottoinsieme di espressioni regolari nelle stringhe di percorso, e utilizza queste espressioni regolari come un controllo condizionale per quel particolare componente del percorso. Non acquisisce il contenuto corrispondente nel condizionale, né consente di confrontare i componenti (parti dell'URL separate da barre).

Ad esempio:

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

Questo percorso corrisponde solo se il primo componente (compa) è una singola cifra, e il secondo componente (compb) è una singola lettera a-z.

'/:href(.+)' dice "corrisponde al primo componente solo se il contenuto è qualsiasi cosa", il che non ha molto senso; questo è comunque il comportamento predefinito. Inoltre, se si esamina the source, si vedrà che Express sta forzando effettivamente il punto in quel condizionale per essere letterale.

Per esempio, app.get('/:href(.+)') compila in realtà in:

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

notate che il vostro . era sfuggito, quindi questo percorso corrisponderà solo uno o più periodi.

1

Si può fare questo con regex di routing

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

non so se la regex è giusto, ma si ottiene l'idea

EDIT:

non credo che il sopra funziona, ma questo non

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

Andando a http://localhost:3000/2012/08/05/hello-i-must-be yeilds req.params = [ '2012', '08', '05', 'hello-i-must-be' ]

+0

Sto provando 'app.get ('/: href (. +)', ...' senza fortuna. Cosa mi manca? –

+0

Non penso che tu possa passare una regexp all'interno di una stringa di percorso Devi passare un oggetto regexp, vedi [la mia risposta] (http://stackoverflow.com/a/14915608/201952). – josh3736

+0

Questo: http://stackoverflow.com/a/12334009/8446 implicherebbe che tu può ... –

23

Sembra che app.get("/:href(*)", ...) funzioni correttamente (almeno in Express 4). Otterrai il valore del parametro in req.params.href.

Sarà inoltre attivato dal percorso /, che probabilmente non è quello che si desidera. Puoi evitarlo impostando app.get('/', ...) altrove nella tua app o controllando esplicitamente una stringa vuota.

Problemi correlati