Javascript Node.js+Mongoose。。。控制流问题?
刚开始使用node.js,有一些JavaScript方面的经验,但在服务器端很少 我有下面的代码,我正在寻找的功能也是使用Mongoose将产品添加到集合中,但是,如果使用“名称”找到了副本,则将产品作为嵌入文档推送到副本中,仅使用选择信息,如产品ID、包装信息、,等等。我假设问题与findOne有关,在第一次运行时没有找到任何重复项。如果我第二次运行它,它确实会检测到重复项,但到那时已经太晚了。我不知道如何让findOne仅在上一次“保存”后运行Javascript Node.js+Mongoose。。。控制流问题?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,刚开始使用node.js,有一些JavaScript方面的经验,但在服务器端很少 我有下面的代码,我正在寻找的功能也是使用Mongoose将产品添加到集合中,但是,如果使用“名称”找到了副本,则将产品作为嵌入文档推送到副本中,仅使用选择信息,如产品ID、包装信息、,等等。我假设问题与findOne有关,在第一次运行时没有找到任何重复项。如果我第二次运行它,它确实会检测到重复项,但到那时已经太晚了。我不知道如何让findOne仅在上一次“保存”后运行 function insertProduct(
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仅在我第二次运行应用程序时找到重复项。在第一次运行时,从一个空集合开始,由于某种原因,它看不到任何新创建的文档,因此它找不到重复的文档。还有其他想法吗?再次感谢!