gpt4 book ai didi

javascript - 数组在 Nodejs 和 MongoDB 中使用 forEach 循环返回空值

转载 作者:行者123 更新时间:2023-11-30 15:28:24 32 4
gpt4 key购买 nike

我正在使用 Nodejs、MongoDB 和 Express 进行编码。下面的代码在 MongoDB 中查找具有特定 id 的用户对象。找到用户对象后,它会检索该对象的 favorite 属性。 favorite 属性是一个数组,其每个元素都是产品的 _id。我试图遍历这个数组。在每个循环中,我尝试从 MongoDB 检索一个产品对象并将该产品对象附加到新数组(在我下面的代码中它称为“列表”)。我放了一些 console.log() 来检查列表的值。它在每个循环中都有值(value),但最后当我得到最后一个循环时,它为空。我知道问题的发生是因为我没有正确使用 deferred.resolve 和 deferred.promise。请帮助我并解释 deferred.resolve 和 deferred.promise 在代码中的工作原理。非常感谢

function showBasket(user) {
var deferred = Q.defer();
var list =[];
db.users.findById(user, function (err, user) {
if (err) deferred.reject(err);
if (user) {

var favorite = user.favorite;
favorite.forEach(function(e){
db.products.findById(mongo.helper.toObjectID(e), function(err, product){

if (err) deferred.reject(err);
if (product) {
list.push(product);
console.log(list);// list has value here
}

})//end db.products.findById

})//end of forEach

} //end of if
console.log(list);// But finally, list has null value here
deferred.resolve(list);
});//end of db.users.findById

return deferred.promise;
}

最佳答案

这是一个异步问题,但是你的forEach没有用,因为有$in运算符,它将获取字段值等于数组中任何值的所有文档:

db.products.find({
"_id": {
"$in": user.favorite
}
}, function(err, products) {

// here products is an array of product

if (err) {
console.log(err);
deferred.reject(err);
} else {
console.log(products);
deferred.resolve(products);
}
})

结果是一组与 user.favorite 数组中所有 id 匹配的产品。如果您在 user.favorite 中的项目不是 ObjectId 类型,您可能需要在查询之前对每个项目执行 mongo.helper.toObjectID(item) :

var favoriteArr = [];

for (var i = 0; i < user.favorite.length;i++)[
favoriteArr.push(mongo.helper.toObjectID(user.favorite[i]));
}
// use favoriteArr with $in operator

关于javascript - 数组在 Nodejs 和 MongoDB 中使用 forEach 循环返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42615878/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com