2017-04-19 134 views
1

这里是我的猫鼬架构的特性“推”:无法读取未定义

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var CartSchema = new Schema({ 
userID: String, 
items: [{ 
    itemID: String, 
    quantity: Number 
}] 
}); 

module.exports = mongoose.model('Cart', CartSchema); 

这里是它采用快递Node.js的服务器。它有一个触发是否应该更新用户与req.body传递的信息车/add-to-cart路线:

router.post('/add-to-cart', function(req, res, next) { 
     Cart.find({ userID: req.body.userID }).then(function(userCart){ 
      console.log("TEST: "+JSON.stringify(userCart)); 
      var myItem = {itemID: req.body.itemId, quantity: 1} 
      userCart.items.push(myItem); 
      res.send(userCart); 
     }).catch(next); 
    }); 

我打印到终端userCart,你可以在我的代码中看到,它返回我:

[{ 
    "_id":"58f7368b42987d4a46314421", // cart id 
    "userID":"58f7368a42987d4a46314420", // userid 
    "__v":0, 
    "items":[] 
}] 

当服务器执行userCart.items.push(myItem);它返回此错误:

Cannot read property 'push' of undefined 

为什么,如果我alread items没有定义y在猫鼬中定义了它的结构?

+7

'userCart'显然是一个数组,所以'userCart [0] .items' – adeneo

回答

0

由于adeneo正确pointed outuserCart显然是一个数组,但你需要使用的更新方法之一将文档推到项阵列,建议Model.findOneAndUpdate()

router.post('/add-to-cart', function(req, res, next) { 
    Cart.findOneAndUpdate(
     { userID: req.body.userID }, 
     { $push: { items: { itemID: req.body.itemId, quantity: 1 } } }, 
     { new: true } 
    ) 
    .exec() 
    .then(function(userCart) { 
     console.log("TEST: "+ JSON.stringify(userCart)); 
     res.send(userCart); 
    }) 
    .catch(next); 
}); 
0

由于adeneo尖out userCart是一个数组,因为您使用的是find方法。但显然你需要找到一个由它的userID给出的文档,所以建议使用findOne()来代替。

此外,您还需要保存文档以便更改实际反映。

看一看下面的更新的代码:

router.post('/add-to-cart', function(req, res, next) { 
    Cart.findOne({ userId: req.body.userID }, function(err, userCart){ 
     if(err) return next(err); 
     console.log("TEST: "+JSON.stringify(userCart)); 
     var myItem = {itemID: req.body.itemId, quantity: 1} 
     userCart.items.push(myItem); 
     userCart.save(function(err, usersCart) { 
      if(err) return next(err); 
      res.send(usersCart); 
     }) 
    }) 
}); 

希望这有助于。