我想使用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
会出现这种情况?
答案 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之后。