我有一条看起来像这样的路线:
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参数,或者我是否必须使用正则表达式来检测它?
修改:
更清楚,以下是我正在努力实现的要求:
答案 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
}
});
,请点击此处的“快速路线”
答案 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"]
。