【问题标题】:regex in express route not capturing full request parameter快速路由中的正则表达式未捕获完整的请求参数
【发布时间】:2017-09-25 01:58:50
【问题描述】:

我几乎肯定这个错误存在于 express 处理路由定义中的正则表达式模式的方式中,但话又说回来,它可能存在于我的模式中(我仍然是一个正则表达式新手,所以请原谅)。在我的快速路由定义中,我试图匹配路由路径中的数字:

const router = express.Router()

// pattern: ignore first capture (/) 
router.route(/^(?:\/)(\d+)$/)
  .get(...callback)

目前,捕获的数字可以是任意长度。因此,当 url 为:http://localhost:8000/1234 时,事情按预期工作,除了未捕获完整数字的事实 - 当我在回调中记录请求参数时,我得到:{ '0', '4' }。如您所见,我得到了号码的最后一位:4:1234。出了什么问题?我在这里用力挠头。当我在regexr 和 Node REPL:/^(?:\/)(\d+)$/.exec('1234')[1] === '1234' 中测试我的正则表达式时,它似乎匹配正确。任何帮助/见解将不胜感激。谢谢。

[编辑]:按照@Tolsee的建议,我将我的快递包从v4.15.3升级到v4.15.5(最新版本)。这似乎解决了这个问题;现在,我的正则表达式模式正在为这条路线工作。我猜问题出在较旧的快递包裹上。

【问题讨论】:

  • 如果你的路由中的数字是一个参数,那么它可以被router.route('/:id')捕获
  • 我应该考虑到这一点。我想在将模式用于另一条路线后,我的思想仍处于正则表达式模式。感谢您的回复。现在,虽然您的方法确实有效,但我仍然很好奇为什么正则表达式方法在这里失败了。
  • 您使用的是什么版本的快递?它对4.15.5 非常有效。你表明req.params 是{'0', '4'} 不是req.params 一个js 对象??
  • @Tolsee 我刚刚升级了我的快递包裹。它现在在版本4.15.5 中工作。以前,我在我的应用程序中运行 v4.15.3。我想这是一个明确的问题。感谢您在这里的洞察力;是的,req.params 在这里是一个 JS 对象。这是我现在要接受的答案。如果您愿意将此作为答案提交,我会将其标记为正确回复。

标签: javascript regex express


【解决方案1】:

你不应该在这里使用Regexp,最好使用/:id/ (docs)。

如果你还想用Regexp,试试/^\d+(?:\/(?=$))?$/i

希望对你有用!

【讨论】:

  • 在路径中使用路由参数的名称肯定解决了这里的问题,谢谢。现在,我在我的路线中尝试了您的正则表达式模式,但它似乎不起作用。另外,我将我的快递包从 v4.15.3 升级到 v4.15.5 (就像@Tolsee 建议的^^)。这似乎解决了路由定义中我的正则表达式模式的问题。我猜这是一个明确的问题。
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 2019-02-24
  • 2013-10-22
  • 2021-09-03
相关资源
最近更新 更多