我在这里尝试做的是通过id找到用户,如果找不到用户,那么我将它添加到集合中。但是,如果找到,我只想将新产品推送到现有用户的文档中。
这里的问题是for循环中的以下if语句:
for(var i=0; i < data.products.length; i++) {
console.log("Product
found:"+!data.products[i].product.equals(req.body._id));
//if the requested product is not found
if(!data.products[i].product.equals(req.body._id)){
data.products.push({product: req.body._id, isAdded: true,
quantity:1});
}
console.log("Adding product.....");
}//for loop
似乎第一次迭代发现条件为true,即使我已经有一个具有相同id的产品。只要我的文档中存在id,它就应该是false。有人能够解释一下Mongoose的这种行为吗?
for循环中的console.log返回以下结果:
Product found:true
Adding product.....
Product found:false
Adding product.....
Product found:false
Adding product.....
Product found:false
Adding product.....
api.post('/me/cart', wagner.invoke(function(Cart) {
return function(req, res, next) {
console.log("new post request"+ req.headers['usr'] );
Cart.findOne({userId: req.headers['usr']},
function(err,data){
if(err){
throw err;
}
console.log("found this..."+ (!data));
//if No user is found add a new cart
if(!data && data.length < 0){
var cart = new Cart();
cart.userId = req.headers['usr'];
cart.products.push({product: req.body._id,
quantity:1, isAdded:true});
cart.save(function(error, data) {
if (error){
return res.
status(status.INTERNAL_SERVER_ERROR).
json({ error: error.toString() });
};
return res.json({ product: data });
});
}
//if user is found updated found users cart
else if (data){
for(var i=0; i < data.products.length; i++){
//if the requested product is not found
if(!data.products[i].product.equals(req.body._id)){
data.products.push({product: req.body._id,
isAdded: true, quantity:1});
}
console.log("Adding product.....");
}//for loop
data.save(function(err, updatedCart){
if(err)
throw err;
console.log(updatedCart);
return res.json(updatedCart);
});
}//else if
});
};
答案 0 :(得分:0)
我做错了。循环基础的基本原则lol很明显,每次找不到产品ID时条件都是正确的,因此每次找不到id时都会执行push语句。这将导致它在数据库中创建重复数据。 解决方案只是在if条件中添加boolean标志,如果找不到值则将其打开,然后使用该标志保存并推送新产品。
P.s卡住了丢失的分号类型的问题3天大声笑只是因为我忘记了次要的循环基础。无论如何,错误是教给我们最好的东西:D Enjoy。