簡體   English   中英

Node.js + Mongoose ......控制流量問題?

[英]Node.js + Mongoose… Control flow issue?

剛剛開始使用node.js,有一些過去的JavaScript經驗,但在服務器端很少。

我有以下代碼,我正在尋找的功能是使用Mongoose將產品添加到集合中,但是,如果使用'name'找到副本,則將產品作為嵌入文檔推送到副本,只選擇信息,例如product_ids,包信息等。我假設問題與findOne在第一次運行時沒有找到任何重復項有關。 如果我第二次運行它,它確實檢測到重復,但到那時為時已晚。 我不確定如何在前一次“保存”發生后才讓findOne運行。

function insertProduct(data) {
    var product;
    Product.findOne({
        name: data.name
    }, function(err, doc) {
        if (err) throw err;
        if (!doc) {
            product = new Product({
                name: data.name
                //other product data
            });
            product.packages.push({
                //package data
            });
        }
        else if (doc) {
            doc.packages.push({
                //package data
            });
            product = doc;
        }
        product.save(function(err) {
            if (err) throw err;
            console.log('Added: ' + product.name);
        });
    });
}

request(url, function(error, response, body) {
   if (!error && response.statusCode === 200) {
      jsonResult = JSON.parse(body);
      jsonResult.result.forEach(insertProduct);
   }
});

我意識到這必須是控制流程的一個問題,我仍然試圖抓住它。 非常感謝您的幫助!

歡迎來到非阻塞IO和JavaScript閉包的世界 :)

更簡單的方法是分離產品創建並在成功創建產品后推送包。

addProduct = function(name, next) {
  Product.findOne({name: name}, function(err, doc) {
    if(doc) {
      next(null, doc);
    }
    else {
      // create new product...
      var d = new Product({name: name});
      next(null, d);
    }
  });
});

// ... snipped

jsonResult.result.forEach(function(item) {
  addProduct(item.name, function(err, doc) {
    if(err == null) {
      doc.packages.push({
        // stuffs
      });
      doc.save();
    }
  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM