我正在尝试从“ Books.find”中获取结果,并将其推入我的Books数组中。然后,我想重新发送。
我怀疑这与某种异步和作用域垃圾有关。
有什么解决方案?
这是我目前的代码。
exports.timeline = function(req, res) {
var Followers = mongoose.model('Follow');
Followers.find({'follower': req.user.username}, function(err, followerResult) {
var name = [req.user.username];
var books = [];
function addName(username) {
name.push(username);
}
for(var user in followerResult) {
addName(followerResult[user]['followed']);
}
function getDataByUsername(username) {
function addBookArray(result) {
books.push(result);
return result;
}
var Books = mongoose.model('Book');
Books.find({'username': username}).exec(function (err, result) {
addBookArray(result);
});
}
for(var usernames in name) {
getDataByUsername(name[usernames]);
}
console.log(books);
res.send(books);
});
}
答案 0 :(得分:0)
答案 1 :(得分:0)
节点Js是异步的。您的代码永远不会等待查询结果。
以下是您可以尝试的一些选项:
承诺示例:-
Promise.all([qry1, qry2]).then(res=>{ console.log(res) }).catch(err=>{console.log(err);})
这里qry1和qry2是您的mongo查询
答案 2 :(得分:0)
如果您不想使用async软件包,可以尝试使用mongoose和mongodb的 $ in 功能。与之类似,您将获得用户列表,然后找到其用户ID在用户列表内的书籍列表。 沿着:
exports.timeline = function(req, res) {
var Followers = mongoose.model('Follow');
Followers.find({'follower': req.user.username}, function(err, followerResult) {
var name = [req.user.username];
var books = [];
function addName(username) {
name.push(username);
}
for(var user in followerResult) {
addName(followerResult[user]['followed']);
}
Books.find({"username" : { $in: name }}).exec(function (err, books) {
console.log(books);
res.send(books);
});
});
}
希望这会有所帮助。