Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js+Mongoose。。。控制流问题?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Node.js+Mongoose。。。控制流问题?

Javascript Node.js+Mongoose。。。控制流问题?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,刚开始使用node.js,有一些JavaScript方面的经验,但在服务器端很少 我有下面的代码,我正在寻找的功能也是使用Mongoose将产品添加到集合中,但是,如果使用“名称”找到了副本,则将产品作为嵌入文档推送到副本中,仅使用选择信息,如产品ID、包装信息、,等等。我假设问题与findOne有关,在第一次运行时没有找到任何重复项。如果我第二次运行它,它确实会检测到重复项,但到那时已经太晚了。我不知道如何让findOne仅在上一次“保存”后运行 function insertProduct(

刚开始使用node.js,有一些JavaScript方面的经验,但在服务器端很少

我有下面的代码,我正在寻找的功能也是使用Mongoose将产品添加到集合中,但是,如果使用“名称”找到了副本,则将产品作为嵌入文档推送到副本中,仅使用选择信息,如产品ID、包装信息、,等等。我假设问题与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的世界,并且:

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

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

当然,这是一种更符合逻辑的方式,但它似乎并不奏效。Product.findOne仅在我第二次运行应用程序时找到重复项。在第一次运行时,从一个空集合开始,由于某种原因,它看不到任何新创建的文档,因此它找不到重复的文档。还有其他想法吗?再次感谢!