86

我有一条看起来像这样的路线:

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它,它不会。

是否可以有一个可选的 splat 参数,还是我必须使用正则表达式来检测这个?

编辑

更清楚地说,这是我要达到的要求:

  • 第一个和第二个参数是必需的
  • 第一个参数是静态的,第二个是命名参数。
  • 可以附加任意数量的可选附加参数,并且仍然可以到达路线。
4

7 回答 7

114

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

router.get('/path/:id*?', function(req, res, next) {
    res.render('page', { title: req.params.id });
});
于 2015-04-09T21:13:15.060 回答
77

我只是遇到了同样的问题并解决了。这是我使用的:

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

这应该适用于path/meow, path/meow/voof, path/meow/voof/moo/etc...

似乎通过删除/between?*,最后一个/也成为可选的,而:optional?仍然是可选的。

于 2013-01-23T13:42:01.593 回答
18

这会做你所追求的吗?

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

更多关于 Express 的路由在这里,如果你还没有看过:http ://expressjs.com/guide/routing.html

于 2012-04-04T22:30:51.720 回答
3

这是我解决此问题的当前方法,似乎 express 不支持任意数量的带有可选命名参数的 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 - 如果另一个答案表面允许这样做,我会接受它。

于 2012-04-05T19:23:17.803 回答
3

假设你有这个网址:/api/readFile/c:/a/a.txt

如果你想req.params.path成为c:

'/api/readFile/:path*

如果你想req.params.path成为c:/a/a.txt

'/api/readFile/:path([^/]*)'
于 2019-10-06T08:54:23.787 回答
0

上述使用 optional 的解决方案在 Express 4 中不起作用。我尝试了几种使用搜索模式的方法,但也不起作用。然后我找到了这个方法,似乎被无限嵌套路径解雇了,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 以获取剩余路径。

于 2015-03-17T18:14:13.523 回答
0

我通过使用一个中间件的组合来解决这个问题,该中间件在 url 和 中添加尾部斜杠router.get('/bar/*?', ...,它将在之后拾取所有内容/bar/undefined如果它只是/bar/. 如果访问者要求/barexpress-slash中间件将在请求中添加一个斜线并将请求转换为/bar/.

于 2018-06-15T04:48:32.720 回答