Routing Express.js: parametro spaz opzionale?

Ho un percorso simile a questo:

app.all('/path/:namedParam/*splat?',function(req,res,next){ if(!req.params.length){ // do something when there is no splat } else { // do something with splat } }); 

tuttavia, questo non funziona – se chiamo path/foo/bar esso colpisce il percorso, ma se chiamo path/foo , non lo fa.

È ansible avere un parametro splat opzionale o devo usare una regex per rilevare questo?

Modifica :

per essere più chiari, ecco i requisiti che sto cercando di ottenere:

  • sono richiesti il primo e il secondo param
  • il primo parametro è statico, il secondo è un parametro con nome.
  • qualsiasi numero di parametri addizionali opzionali può essere aggiunto e continua a colpire la rotta.

Funziona per / path e / path / foo su express 4, nota * prima ? .

 router.get('/path/:id*?', function(req, res, next) { res.render('page', { title: req.params.id }); }); 

Ho appena avuto lo stesso problema e l’ho risolto. Questo è quello che ho usato:

 app.get('path/:required/:optional?*', ...) 

Questo dovrebbe funzionare per path/meow , path/meow/voof , path/meow/voof/moo/etc

Sembra facendo cadere il / tra ? e * , l’ultimo / diventa opzionale anche se :optional? rimane facoltativo.

Questo farà ciò che cerchi?

 app.all('/path/:namedParam/:optionalParam?',function(req,res,next){ if(!req.params.optionalParam){ // do something when there is no optionalParam } else { // do something with optionalParam } }); 

Maggiori informazioni sul routing di Express qui, se non si è guardato: http://expressjs.com/guide/routing.html

Ecco il modo in cui sto risolvendo questo problema, non sembra che express supporti un numero qualsiasi di parametri splat con un parametro denominato opzionale:

 app.all(/\/path\/([^\/]+)\/?(.+)?/,function(req,res,next){ // Note: this is all hacked together because express does not appear to support optional splats. var params = req.params[1] ? [req.params[1]] : [], name = req.params[0]; if(!params.length){ // do something when there is no splat } else { // do something with splat } }); 

Mi piacerebbe avere questo nome chiamato params per la leggibilità e l’uniformità – se un’altra risposta emerge da ciò, lo accetterò.

Le soluzioni di cui sopra usando opzionale non funzionano in Express 4. E ho provato un paio di modi usando i pattern di ricerca, ma non funzionando neanche. E poi ho trovato questo metodo e sembra licenziato per un percorso annidato illimitato, http://expressjs.com/api.html#router

 // this will only be invoked if the path starts with /bar from the mount point router.use('/bar', function(req, res, next) { // ... maybe some additional /bar logging ... // to get the url after bar, you can try var filepath = req.originalUrl.replace(req.baseUrl, ""); next(); }); 

Corrisponde a / bar, / bar / z, / bar / a / b / c ecc. E dopo, puoi leggere req.originalUrl, poiché i parametri non sono riempiti, es. puoi provare a confrontare baseUrl e originalUrl per ottenere il percorso rimanente.

Ho router.get('/bar/*?', ... questo problema usando una combinazione di un middleware che aggiunge le barre finali a url e router.get('/bar/*?', ... , che rileverà tutto dopo /bar/ , e ritornerà undefined se è just /bar/ . Se il visitatore ha richiesto /bar , il middleware express-slash aggiungerà una barra alla richiesta e trasformsrà la richiesta in /bar/ .