获取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
相关产品推荐
相关产品推荐

