我在尝试找到值throw 2 model
时遇到了问题.get(function(req, res) {
var sellerPosts = [];
Product.find({seller_id : req.params.seller_id}, function(err, products) {
if (err) throw err;
for (var i = 0; i < products.length; i++) {
console.log("id", products[i].id);
Post.find({product_id : products[i].id}, function(err, posts) {
if (err) throw err;
for (var j = 0; j < posts.length; j++) {
sellerPosts.push(posts[j]);
console.log("in find",sellerPosts);
}
});
console.log(sellerPosts);
}
console.log("test", sellerPosts);
res.send(sellerPosts);
});
})
这是日志:
App listening on port 3000!
Connected to database
id 58ea96464429aa154cb8c43a
[]
id 58ed3171a0cc7f20f4c74c1c
[]
test []
in find [ { _id: 58ed28b8993a2317e41fc742,
product_id: 58ea96464429aa154cb8c43a,
phone: 9123123,
address: 'hanhitie17',
other: 'no others',
__v: 0 } ]
in find [ { _id: 58ed28b8993a2317e41fc742,
product_id: 58ea96464429aa154cb8c43a,
phone: 9123123,
address: 'hanhitie17',
other: 'no others',
__v: 0 },
{ _id: 58ed33cea0cc7f20f4c74c1d,
product_id: 58ed3171a0cc7f20f4c74c1c,
phone: 9123123,
address: 'hanhitie17',
other: 'no others',
__v: 0 } ]
第一个SellerPosts仍然打印出真值,但“测试”日志为空。 做了一些日志。我认为这是因为在Product.find()中的第一个for之后,程序运行res.send然后运行Post.find()。 请帮我解决这个问题!!!!
答案 0 :(得分:0)
是的回复在Post.find
完成之前返回,这是正确的行为,因为javascript是异步的,你应该使用promises
所以我使用promises重写你的代码:
.get((req, res) => {
Product.find({ seller_id: req.params.seller_id })
.then(products => {
let postPromises = products.map(product => {
return Post.find({ product_id: product.id });
});
return Promise.all(postPromises);
})
.then(posts => {
let sellerPosts = Array.prototype.concat.apply([], posts);
res.json(sellerPosts);
})
.catch(err => {
throw err;
});
});
答案 1 :(得分:0)
你在循环中调用Post.find
导致问题,因为它是一个异步操作,你需要使它顺序。您可以使用异步库来执行此操作,如下面的代码所示。
.get(function(req, res) {
var sellerPosts = [];
Product.find({seller_id : req.params.seller_id}, function(err, products) {
if (err) throw err;
async.eachSeries(products, function(product, next){
Post.find({product_id : product.id}, function(err, posts) {
if (err) next(err);
for (var j = 0; j < posts.length; j++) {
sellerPosts.push(posts[j]);
console.log("in find",sellerPosts);
}
next(null);
});
}, function(err){
if(err) throw err;
res.send(sellerPosts);
})
});
})