无法读取的未定义的属性“推”

问题描述 投票:1回答:3

这是我的猫鼬的模式:

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

为什么如果我已经在猫鼬定义其结构items没有定义?

javascript node.js mongodb express mongoose
3个回答
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指出userCart是一个数组,因为你正在使用的查找方法。但显然你需要找到一个只通过其用户ID给定的文档,因此建议使用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);
      })
   })
});

希望这有助于。


0
投票

这可以使用来解决:

router.post('/add-to-cart', function(req, res, next) {
  Cart.findOne({ userID: req.body.userID }).then(function(userCart){
      console.log("TEST: "+JSON.stringify(userCart));
      const a = req.body.items;
      for(i=0;i<a.length;i++)
      {
        userCart.items.push(req.body.items[i]);
      }
      res.send(userCart);
   }).catch(next);
});
© www.soinside.com 2019 - 2024. All rights reserved.