我想要得到的形式(严格地) /forumId/slug/的URL与快递‘router.get()。附加的令牌应该会导致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/threadIdExpress使用path-to-regexp解析字符串,根据docs (https://www.npmjs.com/package/path-to-regexp#user-content-usage),默认情况下“end”选项设置为true,这似乎证实了匹配应该在弹格之后立即停止。
我遗漏了什么?
速递的版本是4.16.4。
更新:删除regex中有关查询参数(?page=2)的部分解决了问题。为什么是这样?我的regex是有缺陷的(我试着找出可能的贪婪匹配,但找不到),还是这是path-to-regexp的期望
发布于 2018-12-07 17:56:05
正如在快递路由文档中所解释的,
查询字符串不是路由路径的一部分。
(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 ({"page": "2/test"})中查询参数的一部分。
这很奇怪,因为斜杠'/‘应该是用于划界的保留字符(GET参数中允许的字符)。更多的资料将是有帮助的。
编辑:引用Douglas (来自那里),Express.js uses Node.js core to parse the paths according to the url spec。‘s的URL模块遵循WHATWG URL标准。
https://stackoverflow.com/questions/53663028
复制相似问题