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'
也是匹配的。你是对的,模式没有捕获路径的其余部分,但这不是一个要求。。。我必须多读几遍才能完全理解它。它只检查路径的第一部分。明白了:)那么不,你是对的,这是一样的。