Node.js Express:顶层路径的可选尾部斜杠

Node.js Express:顶层路径的可选尾部斜杠,node.js,routing,express,Node.js,Routing,Express,更新:我的问题没有准确地传达我想要实现的目标。我希望匹配/foo,/foo/,以及/foo/下的任何内容(例如/foo/asdf/jkl),而不是特定的给定路径。原来的问题如下 我想匹配以下路径: /foo /foo/bar /foo/bar/baz 这些措施也应该奏效: /foo/ -> /foo /foo/bar/ -> /foo/bar /foo/bar/baz/ -> /foo/bar/baz 我尝试了以下方法: app.get

更新:我的问题没有准确地传达我想要实现的目标。我希望匹配
/foo
/foo/
,以及
/foo/
下的任何内容(例如
/foo/asdf/jkl
),而不是特定的给定路径。原来的问题如下


我想匹配以下路径:

/foo
/foo/bar
/foo/bar/baz
这些措施也应该奏效:

/foo/          ->  /foo
/foo/bar/      ->  /foo/bar
/foo/bar/baz/  ->  /foo/bar/baz
我尝试了以下方法:

app.get('/foo/*', ...);

但是,在
/foo
的情况下,这会失败。我知道我可以提供一个正则表达式而不是字符串,但这肯定是一个常见的要求,因此我会惊讶地发现模式匹配DSL不能适应它。

去掉斜杠,它应该可以正常工作:

app.get('/foo', ...);
如果要在一种模式中匹配它们:

app.get('/foo(/bar(/baz)?)?', ...)
允许在末尾添加可选的
/
的默认快速行为适用

编辑:这个怎么样

app.get('/foo/:dummy?*', ...)

看来正则表达式是一种可行的方法:

app.get(/^[/]foo(?=$|[/])/, ...);

我也有这个问题,我必须同意正则表达式工作得最好,但是有一点改进:

app.get('/foo([/].*)?', ...);
这将符合:

/foo
/foo/
/foo/what/ever/you/put/after
/foo/:dummy?*
没有真正考虑到
foo
之后的可选
/
,并且
/foo(/:dummy*)?
没有真正正确匹配

/foo(/:dummy)?*
有点有效,但会创建一个额外的变量,因为它在单独的变量中同时包含
路径
*
,这在本例中是不合适的


所以就我个人而言,我会坚持使用正则表达式。

我知道这是一个老问题,但我遇到了同样的问题,我提出了这个问题:

app.get(['/foo','/foo/*'],…);

这将匹配
/foo
/foo/
,以及
/foo/..
下的任何内容。我认为这是一个比正则表达式更具可读性的解决方案,它清楚地传达了我们的意图。

这将导致误报。例如,
/foobar
将匹配。@davidchambers不匹配。默认情况下,Express会将Andrew建议的路线与
/foo
/foo/
匹配(除此之外没有其他内容)。您可以使用该选项关闭该行为,但在您的情况下,Express的默认行为应该可以正常工作。@robertklep您是对的。我把安德鲁的建议误读为
/foo*
(存在/foobar匹配错误的问题)。
/foo
的问题是/foo/bar不匹配。我总结过。@davidchambers所以你想要一个模式来匹配上面所有的吗?@robertklep是的。理想情况下,一个模式匹配/foo、/foo/,以及/foo/下的任何内容。目前看来,我需要一些类似于
/^[/]foo(?=$|[/])/
:\我已经更新了这个问题。对不起,我第一次说得不清楚
/foo/:dummy?*
应该可以做到这一点,尽管它和等价的正则表达式一样神秘是的,我想它大致可以翻译成
/foo(+.+?)?(.*)
(加上一个尾随斜杠的检查)你能解释一下这是如何改进
/^[/]foo(?=$)/
?@davidchambers
/^[/]foo(?=$124;[/])/
不接受url的其余部分并将其发回一个变量吗。它只匹配
/foo
/foo/
。。。“除非我误解了什么,否则你是在误解模式,”Tokimon说。它匹配以
/foo
开头的字符串,后跟nothing(
$
)或斜杠(
[/]
)。所以
'/foo'
'/foo/'
是匹配的,但是
'/foo/bar/baz'
也是匹配的。你是对的,模式没有捕获路径的其余部分,但这不是一个要求。。。我必须多读几遍才能完全理解它。它只检查路径的第一部分。明白了:)那么不,你是对的,这是一样的。