尝试从基于Node.js中其他集合对象的集合中获取对象

时间:2018-11-16 11:33:36

标签: node.js

尝试基于nodejs中的另一个集合对象从集合中获取对象

router.get('/shopping-cart', isLoggedIn, function (req, res, next) {
qryFilter = { "user_id": req.user._id };
cart.find(qryFilter, function (err, cart) {
    var productcart = [];
    console.log("cart:"+cart);
    for (i = 0; i < cart.length; i++) {
        // console.log(cart[i].id);
        Product.find({ "_id": cart[i].id }, function (err, product) {
            productcart = product;      
        // console.log('Documents: ' + productcart);
        });
    }
    res.render('shop/shopping-cart', {
        layout: 'eshop/blank',
        usercart: cart,
        productcart: productcart,
    });
});

});

产品ID取决于购物车的内容,并且通过for循环我可以获取它,但不能在响应后使用usinf进行循环关闭。渲染请指导我进行操作

1 个答案:

答案 0 :(得分:0)

数据库调用是异步的,而for循环在nodejs中是同步的。使用承诺来致电每个产品。

router.get('/shopping-cart', isLoggedIn, function (req, res, next) {
     qryFilter = { "user_id": req.user._id };

     cart.find(qryFilter, function (err, cart) {
         var productcart = [];
         var promises = [];

         for (i = 0; i < cart.length; i++) {
         // console.log(cart[i].id);
            promises.push(Promise.resolve(Product.find({ "_id": cart[i].id }).lean().exec().then(function (product) {
                  productcart.push(product);      
            }));
         }
         Promise.all(promises).then(function() {
             res.render('shop/shopping-cart', {
                 layout: 'eshop/blank',
                 usercart: cart,
                 productcart: productcart,
            });
        })
    })
})