Node.js + Mongoose ......控制流量问题?

时间:2012-03-02 04:06:18

标签: javascript node.js mongodb mongoose

刚刚开始使用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);
   }
});

我意识到这必须是控制流程的一个问题,我仍然试图抓住它。感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

欢迎来到非阻塞IO的世界,JavaScript closures:)

更简单的方法是分离产品创建并在成功创建产品后推送包。

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();
    }
  });
});