Express.js路由:可选spat参数?

我有一个像这样的路线:

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

然而,这是行不通的 – 如果我调用path/foo/bar它击中的路线,但如果我呼吁path/foo ,它不。

有可能有一个可选的图示参数,或者我必须使用正则expression式来检测这个?

编辑

要更清楚,这里是我试图达到的要求:

  • 第一个和第二个参数是必需的
  • 第一个参数是静态的,第二个参数是一个命名参数。
  • 任何数量的可选的附加参数可以被追加,并仍然击中路线。

这适用于expression式4上的/ path和/ path / foo,注意*之前?

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

我只是有同样的问题,并解决了它。 这是我用过的:

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

这应该适用于path/meowpath/meow/voofpath/meow/voof/moo/etc

它似乎通过删除/之间?* ,最后/成为可选的同时:optional? 仍然是可选的

这会做你以后的事情吗?

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

如果你还没有看过,请点击这里: http : //expressjs.com/guide/routing.html

这是目前我正在解决这个问题的方式,它似乎并没有表示支持任意数量的带有可选命名参数的splat参数:

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

我很乐意将这个用法命名为params以提高可读性和一致性 – 如果另一个答案表面允许,我会接受它。

使用可选的上述解决scheme不能在Express 4中工作。我尝试了几种使用search模式的方法,但是也不能使用。 然后我发现这个方法,并似乎被解雇无限嵌套的path, 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(); }); 

它匹配所有/ bar,/ bar / z,/ bar / a / b / c等。之后,您可以阅读req.originalUrl,因为参数未被填充,例如。 你可以尝试比较baseUrl和originalUrl来获取剩余的path。