You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取Top3高评分产品接口报错:Cast to ObjectId失败求助

错误原因

Express 的路由匹配遵循定义顺序优先原则。如果你的产品路由中,/top 路由被放在了类似 /:id 的动态参数路由(比如获取单个产品详情的路由)之后,当请求 /api/products/top 时,Express 会把字符串 "top" 识别为动态参数 id 的值,尝试将其转换为 MongoDB 要求的 ObjectId 格式,但 "top" 并非有效的 ObjectId,因此触发类型转换失败的错误。

解决方法

调整路由的定义顺序,将 /top 路由提前到所有动态参数路由(如 /:id)的前面,确保 Express 优先匹配到 /top 这个固定路由,而不会把它误判为动态 id 参数。

调整后的示例代码:

// 先定义固定的/top路由
router.get(
  '/top',
  asyncHandler(async (req, res) => {
    const products = await Product.find({}).sort({ rating: -1 }).limit(3)
    res.json(products)
  })
)

// 再定义动态参数的/:id路由
router.get(
  '/:id',
  asyncHandler(async (req, res) => {
    const product = await Product.findById(req.params.id)
    if (product) {
      res.json(product)
    } else {
      res.status(404)
      throw new Error('Product not found')
    }
  })
)

内容的提问来源于stack exchange,提问作者Usama khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:06:28