【问题标题】:Mongoose promise function in forEach Loop is not workingforEach 循环中的猫鼬承诺功能不起作用
【发布时间】:2019-08-11 04:26:18
【问题描述】:

我正在使用 Express 和 Mongoose 在 Node 中编写一个网上商店。 Mongoose 模型是“产品”和“项目”。每个项目都属于一个产品。我想计算产品(库存)的项目并将此信息提供给视图。

问题是 res.render 部分是在 forEach 循环完成之前执行的。所以“product.stock”是未定义的

exports.getProducts = (req, res, next) => {
    Product.find()
        .lean()
        .then(products => {

            products.forEach(product => {
                Item.countDocuments({productId: product._id})
                    .then( count => {
                        product.stock = count
                    })
            });

            res.render('shop/product-list', {
                path: '/products',
                pageTitle: "All Products",
                products: products
            })
        })
        .catch(err => { return next(err) })
};

【问题讨论】:

    标签: javascript node.js express mongoose


    【解决方案1】:

    尝试使用async/await

    exports.getProducts = (req, res, next) => {
        Product.find()
            .lean()
            .then(async (products) => {
                await Promise.all(products.map(async (product) => {
                    product.stock = await Item.countDocuments({productId: product._id});
                });
    
                res.render('shop/product-list', {
                    path: '/products',
                    pageTitle: "All Products",
                    products: products
                })
            })
            .catch(err => { return next(err) })
    };
    

    我将forEach 更改为map,以便您的Product 列表将转换为Promise 列表。然后Promise.all 等到所有Promises 完成,这将在为每个产品设置product.stock 时发生。只有这样,res.render() 才会被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-01
      • 2016-06-04
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2015-05-12
      • 2018-02-15
      相关资源
      最近更新 更多