node.js项目中javascript函数的程序执行流程

时间:2018-02-05 06:14:37

标签: node.js express

我在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
这是请求对象

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是,您在storeController.deleteStoreProduct函数中调用异步函数storeModel.findById,并期望storeController.deleteStoreProduct的行为类似于同步函数。

您的storeController.deleteStoreProduct函数始终将返回 false

您的代码无法打印

  

isDeleted:true

eventhough项目因代码块

而被正确删除
console.log('isdeleted: true');
return true;

永远不会被执行。

您不能将storeController.deleteStoreProduct视为同步函数。您需要将storeController.deleteStoreProduct视为异步函数,方法是将其设为接受回调的函数或使其成为返回函数的函数。

希望这有帮助。