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/meow
, path/meow/voof
, path/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。