在快速路由器中使分隔符可选

Make separator optional in express router

我的网址可能看起来像 /posts/sluggish-slug-postId123/posts/postId123

我的路由器当前包含:

router.get('/posts/:slug?-:id([a-zA-Z0-9]+)', function () {...}

但使用此正则表达式 slugid 之间的 - 是强制性的,这意味着我无法验证仅包含 id 的网址(例如 /posts/postId123)。如何使 - 分隔符可选并保持 slug 可选?

应该匹配的路径

应该匹配的路径

试试这个:

\/posts\/(?<slug>.+\-)?(?<id>\w+)$

结果:

/posts/going-long-for-the-ball-3a6p412 (match)
/posts/3a6p412 (match)
/posts/-3a6p412 (no match)

你可以在这里测试:https://regex101.com/r/jLMzjM/2

我不太明白你想要什么,但这很接近:

router.get('/posts/:slug([a-z][a-z\-]{0,}-|):id([a-zA-Z0-9]+)', function (req, res) {

slug 将包括结尾的 -(如果存在),如果没有 slug 则它将是一个空字符串。 [a-z][a-z\-]{0,} 部分确保 slug 必须以 a-z 范围内的字符开头,然后可以包含 a-z- 中的任意数量的字符。如果您的 slug 可以包含其他字符,您只需要相应地调整该部分。请注意,我使用的是 {0,} 而不是 *,因为 Express 路由解释 *.

的方式有一个怪癖

Express 路由转换为正则表达式的方式有些难以遵循,并且 Express 4 和 5 之间存在重大变化,这使得使用复杂表达式成为未来兼容性的不安全赌注。如果您想做一些比文档中给出的示例更复杂的事情,我建议您只使用实际的 RegExp 来代替不可靠的中间人。或者,您可以完全跳过尝试 parse/validate 路由路径中的 URL,而是在您的处理程序函数中执行此操作。