Enrutamiento Express.js: parámetro de salta opcional

Tengo una ruta que se ve así:

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 } }); 

sin embargo, esto no funciona: si llamo a path/foo/bar se llega a la ruta, pero si llamo a path/foo , no lo hace.

¿Es posible tener un parámetro splat opcional, o tengo que usar una expresión regular para detectar esto?

Editar :

para ser más claro, aquí están los requisitos que estoy tratando de lograr:

  • el primer y segundo params son obligatorios
  • el primer param es estático, el segundo es un param nombrado.
  • Se puede agregar cualquier cantidad de parámetros adicionales opcionales y seguir llegando a la ruta.

Esto funciona para / ruta y / ruta / foo en expreso 4, observe el * antes ? .

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

Solo tuve el mismo problema y lo solucioné. Esto es lo que utilicé:

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

Esto debería funcionar para path/meow , path/meow/voof , path/meow/voof/moo/etc

Parece al dejar caer el / entre ? y * , el último / vuelve opcional cuando :optional? sigue siendo opcional

¿Esto hará lo que estás buscando?

 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 } }); 

Más sobre el enrutamiento de Express aquí, si no lo ha buscado: http://expressjs.com/guide/routing.html

Esta es la forma actual en la que estoy resolviendo este problema, no parece que Express soporte ningún número de parametros splat con un parámetro llamado opcional:

 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 } }); 

Me encantaría tener este uso llamado params para legibilidad y coherencia. Si surge otra respuesta que me permita esto, lo aceptaré.

Las soluciones anteriores que usan opcionalmente no funcionan en Express 4. Y probé algunas formas de usar patrones de búsqueda, pero tampoco funcionó. Y luego encontré este método y parece disparado para una ruta anidada ilimitada, 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(); }); 

Es coincidencia con todos / bar, / bar / z, / bar / a / b / c etc. Y después de eso, puede leer req.originalUrl, ya que los params no están completos, ej. puede intentar comparar baseUrl y originalUrl para obtener la ruta restante.

router.get('/bar/*?', ... este problema usando una combinación de un middleware que agrega barras diagonales a url y router.get('/bar/*?', ... , que recogerá todo después de /bar/ , y devuelve undefined si es solo /bar/ . Si el visitante solicitó /bar , el middleware express-slash agregará una barra inclinada a la solicitud y convertirá la solicitud en /bar/ .