Express:***路径的可选斜杠
Posted
技术标签:
【中文标题】Express:***路径的可选斜杠【英文标题】:Express: Optional trailing slash for top-level path 【发布时间】:2013-05-10 18:05:27 【问题描述】:更新:我的问题没有准确传达我想要达到的目标。我希望匹配/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 不适应它。
【问题讨论】:
【参考方案1】:看来正则表达式是要走的路:
app.get(/^[/]foo(?=$|[/])/, ...);
【讨论】:
【参考方案2】:如果你想在一个模式中匹配它们:
app.get('/foo(/bar(/baz)?)?', ...)
默认的 Express 行为允许在末尾添加可选的 /
。
编辑:这个怎么样?
app.get('/foo/:dummy?*', ...)
【讨论】:
我已经更新了问题。很抱歉我第一次不清楚。 嘿。/foo/:dummy?*
应该可以解决问题,尽管它与等效的正则表达式一样神秘。 ;)
是的,我认为它大致翻译为/foo(/.+?)?(.*)
(加上沿途检查尾随斜线)【参考方案3】:
我知道这是一个老问题,但我有同样的问题,我想出了这个:
app.get(['/foo', '/foo/*'], ...);
这将匹配/foo
、/foo/
以及/foo/...
下的任何内容。我认为这是一个比正则表达式更具可读性的解决方案,它可以清楚地传达预期的内容。
【讨论】:
【参考方案4】:我也遇到过这个问题,我必须同意正则表达式效果最好,但是有一点改进:
app.get('/foo([/].*)?', ...);
这将匹配:
/foo
/foo/
/foo/what/ever/you/put/after
/foo/:dummy?*
并没有真正考虑foo
之后的可选/
,/foo(/:dummy*)?
并没有真正正确匹配。
/foo(/:dummy)?*
有点工作,但创建了一个额外的变量,因为它在单独的变量中同时具有 path
和 *
,在这种情况下这是不合适的。
所以我个人会坚持使用正则表达式。
【讨论】:
你能解释一下这是对/^[/]foo(?=$|[/])/
的改进吗?
@davidchambers /^[/]foo(?=$|[/])/
不会获取 URL 的其余部分并将其发送回变量。它只匹配/foo
和/foo/
...除非我误解了什么
你误解了这个模式,@Tokimon。它匹配以/foo
开头的字符串,后跟任何字符 ($
) 或斜杠 ([/]
)。所以'/foo'
和'/foo/'
匹配,但'/foo/bar/baz'
也是如此。您说得对,该模式不会捕获路径的其余部分,但这不是必需的。
好的,是的...我不得不再读几遍才能完全理解它。它只检查路径的第一部分。明白了 :) 那么不,你是对的,这是一回事。【参考方案5】:
去掉斜线,它应该可以正常工作:
app.get('/foo', ...);
【讨论】:
这会导致误报。例如,/foobar
会匹配。
@davidchambers 不会。默认情况下,Express 会将 Andrew 建议的路线与/foo
和/foo/
匹配(但仅此而已)。您可以使用 strict routing 选项关闭该行为,但在您的情况下,Express 的默认行为应该可以正常工作。
@robertklep 你是对的。我将 Andrew 的建议误读为 /foo*
(存在 /foobar 匹配错误的问题)。 /foo
的问题是 /foo/bar 不匹配。我总结了problems with /foo
and /foo*
。
@davidchambers 所以你想要一个模式来匹配以上所有的?
@robertklep 是的。理想情况下,一种模式可以匹配 /foo、/foo/ 以及 /foo/ 下的任何内容。目前看来我需要/^[/]foo(?=$|[/])/
之类的东西。 :\【参考方案6】:
这是 regex101 中@davidchambers 答案的示例。
但我删除了[]
并添加了转义\
,注意正则表达式选项是gm
(全局和多行)。
app.get(/^[/]foo(?=$|[/])/, ...);
https://regex101.com/r/q38rvF/1
【讨论】:
以上是关于Express:***路径的可选斜杠的主要内容,如果未能解决你的问题,请参考以下文章