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

Jes*_*sse 75 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
  }
});
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用 - 如果我打电话给path/foo/bar它击中路线,但如果我打电话path/foo,它不会.

是否可以使用可选的splat参数,或者我是否必须使用正则表达式来检测它?

编辑:

为了更清楚,这是我想要实现的要求:

  • 第一和第二个参数是必需的
  • 第一个参数是静态的,第二个是命名的参数.
  • 可以附加任意数量的可选附加参数并仍然可以在路线上.

Chr*_*ris 97

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

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

  • 请注意,虽然这确实有效,但是如果你访问`/ path/foo/bar/bazzle`,`req.params.id`将等于`foo`,而`req.params [0]`将等于`/ bar/bazzle `,这可能会让一些人绊倒.一个更干净的解决方案可能是将路径定义为`/ path/*?`,在express 4中将`req.params [0]`设置为`foo/bar/bazzle`,这可能更接近你的寻找. (38认同)

And*_*ren 69

我只是遇到了同样的问题并解决了它.这是我用过的:

app.get('path/:required/:optional?*', ...)
Run Code Online (Sandbox Code Playgroud)

这应该工作path/meow,path/meow/voof,path/meow/voof/moo/etc...

似乎通过删除/介于?和之间*,最后/变为可选,同时:optional?保持可选.

  • 在快递4.0x中,这似乎不再起作用 (8认同)
  • 你知道在哪里可以阅读更多关于这些预定义关键字的信息吗 (5认同)
  • @chris 为 express 4 回答了这个问题——因为这是最新的,我把接受的答案移到了他的。 (2认同)

Dav*_*ard 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
  }
});
Run Code Online (Sandbox Code Playgroud)

有关Express'路由的更多信息,如果您还没有看过:http://expressjs.com/guide/routing.html

  • 这个解决方案匹配`/ path/foo/bar`,但不匹配`/ path/foo/bar/baz` - ```splat匹配`.+`,这对我正在做的事情是必要的 - 我是绝对rtfm,似乎没有提到它,所以也许它不可能...... (2认同)

yay*_*aya 7

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

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

'/api/readFile/:path*
Run Code Online (Sandbox Code Playgroud)

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

'/api/readFile/:path([^/]*)'
Run Code Online (Sandbox Code Playgroud)