gpt4 book ai didi

javascript - 如何使用 Promise 和 forEach 循环遍历 mongoDB?我想填充一个数组

转载 作者:行者123 更新时间:2023-12-02 22:36:48 26 4
gpt4 key购买 nike

我正在尝试循环遍历 MongoDB 数据库中的元素并将值保存到数组中。然而,经过几个小时的努力,我无法完成它。

这是我的代码:

//shopController.js

const Product = require('../models/product');
const User = require('../models/user');


exports.getCart = (req, res, next) => {
const productIds = [];
const productsArr = [];
let userData = null;

User.findById(req.user._id)
.then(user => {
userData = user;
userData.cart.items.map(prodId => {
productIds.push(prodId.productId);
})
console.log(productIds); // [ 5dc1b6ace13a97588620d6c6, 5dc1b6ace13a97588620d6c6 ]
return productIds;
})
.then(prodIds => {
prodIds.forEach(prodId => {
Product.findById(prodId)
.then(product => {
productsArr.push(product);
})
.catch(err => console.log(err))
})
console.log(productsArr); // []
})
.catch((err) => {
const error = new Error(err);
error.httpStatusCode = 500;
return next(error);
});
}

不要介意第一个输出,它的目的是显示相同的 ID 两次。当我记录 productsArr[] 时,结果始终是一个空数组,除非我将 console.log(productsArr); inside forEach() 循环,我不想要它,因为它被记录得太频繁,而且我无法呈现这样的 EJS 页面。

渲染函数如下所示:

res.render('shop/cart', {
path: '/cart',
docTitle: 'Cart',
products: productsArr,
userData: userData
});

当我尝试访问 productsArr[] 时,我无法将 products 放入 productsArr[] 在 forEach() 循环之外我得到了一个空数组,所以我不知道如何处理这个问题。

你有什么建议吗?

提前致谢!

最佳答案

您需要在 Promise 全部解析后使用 Promise.prototype.all 渲染它,没有其他方法可以获取填充的 productsArr 数组。

试试这个:

//shopController.js

const Product = require('../models/product');
const User = require('../models/user');


exports.getCart = (req, res, next) => {
const productIds = [];
// const productsArr = []; not needed anymore
let userData = null;

User.findById(req.user._id)
.then(user => {
userData = user;
userData.cart.items.map(prodId => {
productIds.push(prodId.productId);
})
console.log(productIds); // [ 5dc1b6ace13a97588620d6c6, 5dc1b6ace13a97588620d6c6 ]
return productIds;
})
.then(prodIds => {
Promise.all(prodIds.map(prodId =>
Product.findById(prodId)
).then(productsArr => {
res.render('shop/cart', {
path: '/cart',
docTitle: 'Cart',
products: productArr,
userData: userData
});
console.log(productsArr); // [ ... products ... ]
}).catch(err => {
console.log(err);
})
})
.catch((err) => {
const error = new Error(err);
error.httpStatusCode = 500;
return next(error);
});
}

关于javascript - 如何使用 Promise 和 forEach 循环遍历 mongoDB?我想填充一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716329/

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