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:***路径的可选斜杠的主要内容,如果未能解决你的问题,请参考以下文章

Airport Express UVA - 11374

匹配正则表达式中的可选斜杠

Express中的多个可选路由参数?

Express.js 路由:可选的 splat 参数?

Express.js 路由:可选的 splat 参数?

如何在 React/Express 应用程序中实现可选身份验证?