【问题标题】:flow of program execution of javascript functions in node.js projectnode.js项目中javascript函数的程序执行流程
【发布时间】:2018-02-05 06:14:36
【问题描述】:

我在从 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函数中的最后一个if else语句。 我无法理解这里发生了什么。

更多详情:
函数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 是mongodb中store对象的_id。
3.请求
这是请求对象

【问题讨论】:

    标签: node.js express


    【解决方案1】:

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

    您的 storeController.deleteStoreProduct 函数总是会返回 false

    您的代码不打印

    isDeleted: 真

    即使项目在代码块后被正确删除

    console.log('isdeleted: true');
    return true;
    

    永远不会被处决。

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

    希望这会有所帮助。

    【讨论】:

    • 为什么函数没有立即返回?并且更新语句不起作用也不会引发错误,但更新语句上方和下方的 console.log 语句都会执行。
    • storeController.deleteStoreProduct 立即返回(在执行所有语句后,包括对 storeModel.findById 的调用)。但是对 storeModel.findById 的回调会在稍后运行。
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2021-10-19
    • 2019-02-22
    相关资源
    最近更新 更多