【问题标题】:Express: Optional trailing slash for top-level pathExpress:顶级路径的可选斜杠
【发布时间】: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 不适应它。

【问题讨论】:

    标签: node.js routing express


    【解决方案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

        【讨论】:

          猜你喜欢
          • 2012-11-16
          • 1970-01-01
          • 2021-03-08
          • 2020-11-20
          • 2013-01-28
          • 2017-03-16
          • 1970-01-01
          • 1970-01-01
          • 2012-08-30
          相关资源
          最近更新 更多