Express.js路由:可选的slpat param?

时间:2012-04-04 22:21:50

标签: node.js express

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

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参数,或者我是否必须使用正则表达式来检测它?

修改

更清楚,以下是我正在努力实现的要求:

  • 第一个和第二个参数必需
  • 第一个参数是静态的,第二个是命名的参数。
  • 可以追加任意数量的可选附加参数,但仍可以点击路线。

6 个答案:

答案 0 :(得分:92)

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

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

答案 1 :(得分:14)

这会做你想要的吗?

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

,请点击此处的“快速路线”

答案 2 :(得分: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以提高可读性和一致性 - 如果另一个答案表面允许我接受它。

答案 3 :(得分:1)

假设您具有以下网址:/api/readFile/c:/a/a.txt

如果您希望req.params.path成为c:

'/api/readFile/:path*

如果您希望req.params.path成为c:/a/a.txt

'/api/readFile/:path([^/]*)'

答案 4 :(得分:0)

使用可选项的上述解决方案在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();
});

匹配all / bar,/ bar / z,/ bar / a / b / c等。之后,你可以读取req.originalUrl,因为params没有被填充,例如。您可以尝试比较baseUrl和originalUrl以获取剩余路径。

答案 5 :(得分:0)

我通过使用向网址和router.get('/bar/*?', ...添加尾部斜杠的中间件组合解决了这个问题,它将在/bar/之后拾取所有内容,如果是undefined则返回/bar/只是/bar。如果访问者要求express-slash,则/bar/中间件会在请求中添加斜杠并将请求转换为CMD ["dotnet", "C:\\runtime\\Microsoft.Azure.WebJobs.Script.WebHost.dll"]