捕获路径中带括号的路由

Catching route with parentheses in the path

我有一个 NodeJS 网络应用程序。我用这段文字传播了一条路线:

great impact (learn more at emotionathletes.org/impact)

路线/impact存在,路线/impact)不存在。一些电子邮件客户端在路由中包含右括号,我想重定向它。如果我使用:

router.get("/impact)", (req, res) => {
  res.redirect("/impact");
});

我收到这个错误:

~/emotionathletes/server/node_modules/path-to-regexp/index.js:128
  return new RegExp(path, flags);
         ^

SyntaxError: Invalid regular expression: /^\/impact)\/?$/: Unmatched ')'

我了解路由字符串作为正则表达式的输入,其中括号用于捕获组,因此不能包含括号。使用 HTML 个实体,例如 /impact%29 不会捕获路由 /impact).

一个解决方案是通用处理程序,例如:

router.get("/:token", async (req, res, next) => {

  // Remove parenthesis in the route path.
  let newPath = req.originalUrl.replace(")", "").replace("(", "");
  if (newPath != req.originalUrl) {
    return res.redirect(newPath);
  }

  // Any other routes, such as 404.
  // ...
}

在 NodeJS 中捕获带括号的路由的正确方法是什么?

尝试将 unicode 表达式 [\u0029 = )] 与正则表达式

结合使用

router.get(/impact\u0029/, (req, res) => { ... }

如果您有多条路线遇到同样的问题,我认为您的第二种方法更合适。如果只有一条路由,那么可以使用上面的方案。