首页 > 解决方案 > 我在 NodeJS mongoose 中的模型“Product”的路径“_id”处的值“shopping-cart”的 Cast to ObjectID failed

问题描述

所以我有一个 /shopping-cart 路线,它工作正常,但如果我添加另一条路线(获取 /:id 的路线),它会给我标题中提到的错误。

这是 /shopping-cart 路线:

router.get("/shopping-cart", (req,res)=>{
  
  if(!req.session.cart) return res.redirect("/");
  let xcart= new Cart(req.session.cart);
  res.render("shopping-cart", {products: xcart.generateArray(), totalPrice: xcart.totalPrice, qty: xcart.qty, totalQty: xcart.totalQty})
  
});

现在,上面的这条路线工作正常,但是当我创建另一条路线(下面的代码)时,它给了我标题中提到的错误。这是代码:

router.get("/:id", asyncMiddlewareHandler(async(req,res)=>{
  let id= req.params.id;
  let pproduct= await Product.findById(id);
  console.log(pproduct);
  res.render("product",{product:pproduct});
}))

我不明白为什么使用这条路线会导致该路线出错。有人可以帮我解决这个问题吗?谢谢。

标签: node.jsexpressmongoose

解决方案


shopping-cartstring 不能用作查找文档的值,因为findById()只接受 type 的值ObjectId

解决方案:确保req.params.id始终是文档_id,否则它会将其视为字符串并抛出错误

虽然查找Product.findById(id)id 必须是 ObjectId 类型

router.get("/:id", asyncMiddlewareHandler(async(req,res)=>{
  let id= req.params.id; // req.params.id = 'shopping-cart'
  let pproduct= await Product.findById(id); // accepts _id of type as saved in document for _id
  console.log(pproduct);
  res.render("product",{product:pproduct});
}))

例子:

  • /shopping-cartapi 不起作用

  • /5e85ba9c8467e208597bbfc8会正常工作


推荐阅读