gpt4 book ai didi

javascript - 如何使用 mongoose 更新 MongoDB 中的数组?

转载 作者:行者123 更新时间:2023-12-02 21:22:47 25 4
gpt4 key购买 nike

我有两个架构:用户和产品。用户架构是我存储所有产品 ID 和用户添加到购物车的商品数量的位置。

enter image description here

当用户向“/checkout”发出请求时,它应该更新数量,然后将其从购物车中删除。我在结账时遇到问题,数量没有更新。

router.post('/checkout', auth, catchAsync(async (req, res) => {
const user = await User.findById(req.session.userId);
const err = [];
if (user && user.products.length > 0) {

user.products.map(async (product) => {
let total = 0;
const p = await Product.findById(product.productID);

if (p.quantity > 0 && p.quantity > product.quantity) {
console.log('IN');
total = p.quantity - product.quantity;
console.log(total);

await Product.findOneAndUpdate({ _id: product.productID }, { $set: { quantity: total } });
} else {
err.push(`Item, ${p.name} is sold out`);
}
});
await User.findOneAndUpdate({ _id: req.session.userId }, { $set: { products: [] } });
if (err.length) {
return res.status(500).json({ message: err });
}
return res.status(200).json({ message: 'OK' });
}
return res.status(200).json({ message: 'Empty cart' });
}));

用户架构:

enter image description here

产品架构:

Product

最佳答案

我相信您的代码中的问题出在 user.products.map(...)函数,因为您永远不会等待在映射中创建的所有 promise 得到解决。

换句话说,map函数返回一个待处理 promise 的数组,但它不会等待它们完成,因此继续执行其余代码,到达 res.status(...)map 中的任何代码之前已被处决。

您有不同的选择来解决它,但主要您需要处理 map 返回的 promise 数组。函数并等待它们完成,然后再结束代码。 async/await 有一个关于如何处理这种情况的很好的解释。在Google Developers Web fundamentals guide .

我通常利用Promise.all()函数,它从 Promise 数组中返回单个 Promise,因此您可以等到 map 中的代码对数组中的每个项目并行执行(即您的情况下的 product )。您可以在 MDN documentation 阅读更多相关信息。 .

// ...

let promisesArray = user.products.map(async product => {...});
// promisesArray should look like: [Promise { <pending> }, Promise { <pending> }, … ]

// Using Promise.all we wait for each of them to be done in parallel
await Promise.all(promisesArray);

// Now you are certain the code in the map has been executed for each product

// ...

一个好的做法是使用 try {} catch(err) {} block 周围Promise.all()处理某些 Promise 被拒绝的情况。

关于javascript - 如何使用 mongoose 更新 MongoDB 中的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60807855/

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