这是我的猫鼬模式:
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);
这是使用Express的Node.js服务器。它具有/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
如果我已经在Mongoose中定义了items
的结构,为什么不定义它?
正如adeneo正确指出的,UserCart
显然是一个数组,但您需要使用更新方法之一将文档推送到items数组,建议使用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);
});