快速路由匹配额外的URL令牌

时间:2018-12-07 03:58:10

标签: node.js regex express

我想使用Express'/forumId/slug/获得(严格地)router.get()形式的URL。其他令牌应生成404。

我想出了以下路径路线:/:forumId([^?\/]{0,}):parameters1?/:slug([^?\/]{0,})?:parameters2?根据express-route-tester的表现符合预期。

但是,在子弹之后,Express似乎也正在捕获带有额外令牌的路径。直接传递Javascript正则表达式而不是字符串具有相同的效果。

这是我使用的正则表达式:/^\/(\d+)(?:\?[^\?\/]{0,})?(?:$|\/([^\?\/]{0,})(?:\?[^\?\/]{0,})?\/?$)/

应该匹配(有效)的字符串示例:

/7721
/7721/
/7721?page=2
/7721/ForumTitle/
/7721/AnotherForumTitle?test/
/7721/YetAnotherForumTitle?page=2
/7721?page=3/ForumTitle?page=2
/7721?page=3/ForumTitle?page=2/

不匹配的字符串示例:

/7721?page=3/ForumTitle?page=2/threadId

Express使用path-to-regexp来解析字符串,并且根据文档(https://www.npmjs.com/package/path-to-regexp#user-content-usage),默认情况下'end'选项设置为true,这似乎证实了匹配应该在sl。

我想念什么?

Express的版本为4.16.4。

更新:删除正则表达式中有关查询参数(?page = 2)的部分即可解决此问题。为什么呢?我的正则表达式是否有缺陷(我尝试发现可能的贪婪匹配项,但找不到匹配项)?还是path-to-regexp会出现这种情况?

1 个答案:

答案 0 :(得分:0)

如快速路由文档中所述,

  

查询字符串不是路由路径的一部分

https://expressjs.com/en/guide/routing.html#route-paths)。

因此,不需要在/^\/(\d+)(?:\?[^\?\/]{0,})?(?:$|\/([^\?\/]{0,})(?:\?[^\?\/]{0,})?\/?$)/中捕获查询参数的部分,从而简化了/^\/(\d{1,})(?:$|\/([^\/]{0,})\/?$)/

  • ^\/:端点的开头,后跟斜杠“ /”
  • (\d{1,}):由数字组成的论坛标识符
  • (?:$|\/([^\/]{0,})\/?$)/:在此处结束或捕获一个可选的子弹

此正则表达式与提供的每个示例均匹配,但也捕获了/7721/ForumTitle?page=2/test,应生成404。经过进一步调查,我发现'/ test'被捕获为req.query({{1 }}。

这很奇怪,因为斜杠“ /”是分隔符(Characters allowed in GET parameter)的保留字符。其他信息会有所帮助。

编辑:引用道格拉斯·威尔逊(来自there),{"page": "2/test"}。 Node.js的Express.js uses Node.js core to parse the paths according to the url spec模块位于WHATWG URL Standard之后。