2012-03-02 82 views
3

剛開始使用node.js時,有一些JavaScript經驗,但在服務器端很少。Node.js + Mongoose ...控制流問題?

我有下面的代碼和我正在尋找的功能太添加產品到使用Mongoose的集合,但是,如果使用'名稱'找到重複,然後將產品作爲嵌入式文檔推送到重複,只有選擇信息,如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

歡迎非阻塞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(); 
    } 
    }); 
}); 
+0

絕對是一個更合乎邏輯的方法,但它似乎沒有辦法。 Product.findOne只在第二次運行應用程序時發現重複。在第一次運行時,從一個空集合開始,由於某種原因它沒有看到任何新創建的文檔,所以它找不到重複。任何其他想法?再次感謝! – dnglbr 2012-03-02 16:09:37