【问题标题】:Express sometimes picking wrong route快递有时会选错路线
【发布时间】:2015-06-09 06:02:01
【问题描述】:

我有一个使用 Express (4.0.0) 公开的基于 NodeJS 的 REST 服务,其中我有两条不同的路线,如下所示:

router.get('/buckets/:bucketId/entities/bulk', getEntitiesInBulk);

router.get('/buckets/:bucketId/entities/:key', getEntityByKey);

当我发送这样的请求时:

http://<server:port>/buckets/responses/entities/k3

该请求正在由我在那里定义的getEntityByKey() 处理,但奇怪的是,当我用许多请求轰炸它时,它有时会由getEntitiesInBulk() 处理,并在响应中得到一些错误,只有getEntitiesInBulk() 抛出。

我完全不知道这怎么可能。

【问题讨论】:

  • 您的路线设计存在冲突。它怎么知道"bulk" 不是:key?它应该如何知道选择哪条路线?您可以删除批量路由并在getEntityByKey() 的第一行,检查if (key === "bulk")。如果是,执行getEntititesInBulk()

标签: javascript node.js rest express


【解决方案1】:

Express 很困惑,因为您的路线不是唯一的。 "bulk" 有时会在第一条路线中用作 :key。只需稍微更改签名,例如

router.get('/buckets/:bucketId/entities/bulk', getEntitiesInBulk);
router.get('/buckets/:bucketId/entity/:key', getEntityByKey);

【讨论】:

  • 如您所见,我的请求中从未包含bulk 这个词,那么 express 怎么会混淆?此外,express docs 从未提及此限制,如果您知道任何未解决的问题,请告诉我。
  • 这样改错误会消失吗?你怎么称呼路线?通过浏览器?
  • @ThinkFloyd 那么如果你想获得一个带有“bulk”键的实体呢? Express 不知道这不是一个有效的密钥(即使是人类也只能推测),这就是它感到困惑的原因。
  • @doldt 你就在那里。 @Brasilikum 我已尝试将其更改为 router.get('/buckets/:bucketId/entity/:key', getEntityByKey); 并且看起来它现在正在工作。要调用路由,我正在创建这样的路由器:var router = express.Router();,然后使用它。为了测试我正在使用邮递员发送请求。
猜你喜欢
  • 2016-08-20
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2019-03-11
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多