这是我的猫鼬的模式:
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
没有定义?
作为adeneo正确pointed out,userCart
显然是一个数组,但你需要使用的更新方法之一将文档推到项阵列,建议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);
});
作为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);
})
})
});
希望这有助于。
这可以使用来解决:
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);
});