array.splice()在mongoose中无法正常工作

时间:2018-01-09 19:03:53

标签: javascript arrays node.js mongodb mongoose

我正在使用splice和findOne()删除嵌套元素。

这是我的JSON数据

     "username" : "xyz",
    "ProductInCart" : [
            {
                    "id" : ObjectId("5a533a0a6a0207023b8e30d3"),
                    "ProductImage" :"",
                    "Title" : "Model Green",
                    "Price" : 399,
                    "_id" : ObjectId("5a53667774d601028b9cb43f")
            },
            {
                    "id" : ObjectId("5a533a0a6a0207023b8e30d3"),
                    "ProductImage" :"",
                    "Title" : "Model Green",
                    "Price" : 399,
                    "_id" : ObjectId("5a53667b74d601028b9cb440")
            }

这是我的删除路线

    router.delete('/cart/remove/:ordername/:id',function(req,res){

 var ProductId = req.params.id;
 var OrderName = req.params.ordername; 

User.findOne({id:req.user._id},function(err,user){
if (err) {
throw err;
} else {  
  user.ProductInCart[OrderName].splice(ProductId,1);
  user.save();
  res.redirect("back");
}
})       
})

这将在命令行中返回以下错误

  

TypeError:无法读取属性' ProductInCart'为null

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

您收到错误,因为未定义splice之前引用的位置。传入的“user.ProductInCart [OrderName]”不是对ProductsInCart数组中任何对象的有效引用。

代码正在查看位置,其值在ProductCart属性上作为OrderName传递。我从阅读代码的假设是,您将传递产品名称,而不是作为OrderName传递数组位置。如果是这种情况,您需要在使用拼接之前搜索ProductsInCart数组以找到正确的位置。

总的来说,在引用嵌套属性之前执行空检查是很好的 - 在这种情况下请考虑以下代码。

if (user.ProductInCart && user.ProductInCart[OrderName]) {
   user.ProductInCart[OrderName].splice(ProductId,1);
   user.save();
}

答案 1 :(得分:0)

这是其替代解决方案(不使用.splice())

   router.delete('/cart/remove/:ordername/:id',function(req,res){

     User.update({_id:req.user._id},{ $pull:{ProductInCart:
         {_id:req.params.id}}},function(err,deleted){
               if (err) {
                console.log(err)
               } else {
      res.redirect("back");
      }
    })  
  })