[英]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.