【问题标题】:how to exclude pattern from expressJS route如何从expressJS路由中排除模式
【发布时间】:2016-10-29 06:28:54
【问题描述】:

我正在尝试配置 expressJS 路由。

app.route(base + '/inventory/adjustments').get(policy.isAllowed, inventoryChangeCtrl.search);


  app.route(base + '/inventory/:inventoryId(?!^adjustments$)').get(policy.isAllowed, inventoryCtrl.findById)

考虑输入../inventory/adjustments

问题在于,在第一条路由中,它匹配正确,但控制器调用了 next(),它应该落入我在其他地方设置的 default route handler。但相反,下一个路由处理程序也匹配。

所以现在我尝试使用正则表达式从该路由处理程序中排除更具体的字符串,但现在它与 .../inventory/9039309309 这样的正确输入不匹配。

谁能建议如何从第二条路线中排除第一条路线? (并且仍然允许为默认处理程序调用 next)。

谢谢。

【问题讨论】:

  • 你是说到达 /inventory/adjustments 也匹配到 /inventory/:inventory_id
  • 使用重定向而不是调用 next。
  • 是的@Dave Briand,第二条路由也匹配第一个请求,因为我调用了 next()。如果第一个控制器返回一个响应,它当然不会被调用,但是有一个默认的中间件,我的所有响应都应该通过。

标签: node.js express


【解决方案1】:

如果inventoryId 始终为数字,您可以使匹配更具体:

app.route(base + '/inventory/:inventoryId(\\d+)', ...);

这样,它不会匹配"adjustments" 并且路由不会触发。

这同样适用于它可能匹配的其他特定模式,只要该模式不匹配 "adjustments"

编辑:如果 inventoryId 是 MongoDB ObjectId,匹配将变为:

app.route(base + '/inventory/:inventoryId([a-fA-F\\d]{24})', ...);

【讨论】:

  • inventoryId 是一个十六进制字符串——确切地说是一个 mongodb id(我认为是十六进制)。但我会尝试这种正向匹配方法,看看它是否比尝试排除字符串效果更好。
  • @RichardG 我已经编辑了我的答案,以展示如何匹配ObjectId's
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2018-10-12
  • 2018-02-19
  • 2022-01-10
相关资源
最近更新 更多