我在node.js程序中从MongoDB数组中删除项目时遇到问题,并在程序执行流程中发现了一个烦人的问题。 这是代码:
productController.deleteProduct = function(req,res){
productModel.findById(req.query.id,function(err, product){
if(err){
res.send(err);
}
if(storeController.deleteStoreProduct(product,res.locals.store,req)){
product.remove(function(err){
if(err){
res.send(err);
}
res.send('product deleted successfully');
});
}
else{
res.send('delete operation failed');
}
});
}
上面的功能运行正常。问题在于以下功能。 上面的函数调用storeController.deleteStoreProduct 这是storeController.deleteStoreProduct:
的代码storeController.deleteStoreProduct = function(product, store, req){
var isDeleted = false;
storeModel.findById(store, function(err, foundStore){
if(product.category === "electronics"){
if(product.subcategory === "mobiles"){
console.log('beginning');
storeModel.update({"storeId":"store-456"}, {'$pull': {"electronics.mobiles": mongoose.Types.ObjectId(product._id)}});
console.log('yeah done!!');
isDeleted = true;
}
}
});
if(isDeleted === true){
console.log('isdeleted: true');
return true;
}
else{
console.log('isdeleted: false');
return false;
}
}
在storeController.deleteStoreProduct函数中,我编写了console.log语句,仅用于调试目的。
当我运行这个程序时,它必须做的是从storeModel集合中删除一个特定的项目,而只输出console.log语句; delete语句上方的console.log语句和该语句下面的语句执行正常,但这两个console.log语句中间的实际delete语句不会执行,也不会引发错误。
输出:
isdeleted: false
beginning
yeah done!!
它不是从头开始运行程序,而是直接转到storeController.deleteStoreProduct函数中的last if语句。 我无法理解这里发生的事情。
更多细节:
函数storeController.deleteStoreProduct(product,store,req)
中的参数是
1,产品
这是一个对象,就像这样:
{
"name":"asus zenfone 2",
"category": "electronics",
"subcategory":"mobiles",
"details":{
"specs":["5mp rear cam","2gb ram",16gb rom],
}
}
2.store
store是mongodb中商店对象的_id
3.req
这是请求对象
答案 0 :(得分:0)
您的代码存在的问题是,您在storeController.deleteStoreProduct函数中调用异步函数storeModel.findById,并期望storeController.deleteStoreProduct的行为类似于同步函数。
您的storeController.deleteStoreProduct函数始终将返回 false 。
您的代码无法打印
isDeleted:true
eventhough项目因代码块
而被正确删除console.log('isdeleted: true');
return true;
永远不会被执行。
您不能将storeController.deleteStoreProduct视为同步函数。您需要将storeController.deleteStoreProduct视为异步函数,方法是将其设为接受回调的函数或使其成为返回函数的函数。
希望这有帮助。