繁体   English   中英

为什么Promise.all中的这种Map方法不能与Node.js中的MongoDB和Monk一起正常使用?

[英]Why this Map method within Promise.all won't work correctly with MongoDB and Monk in Node.js?

我在Mongo数据库中有订单数据。 我在同一数据库中也有产品信息,因此需要将它们结合起来。

如果订单有多个产品,则需要为每个产品创建订单的副本。 因此,如果我对某商品有一个订单,那么会有两个相同的订单,每个商品中都有其中一个。 (数据将以CSV格式提交以提供服务,它将不能在一行数据上接受多个产品)

问题是,当我尝试从Monk的Mongo数据库中获取每个订单的产品数据时,只有带有多个项目的每个订单的一个版本才通过CSV传递。

一切都顺利进行到decorateProducts函数,这似乎导致订单丢失。 JSON数组在此之前看起来还不错,但在此之后缺少订单。

以下是相关代码:

...

const decorateProducts = (order) => {
  if (typeof order[0] !== 'undefined' && order[0] !== null) {
  var prodId = order[0].productId;
  return collectionProducts.findOne({"_id": prodId})
  .then(currentProduct => {
    if (currentProduct) {
      var obj = {
        "email" : order[0].email,
        "firstName" : order[0].firstName,
        "lastName" : order[0].lastName,
        "location" : order[0].location,
        "orderNumber" : order[0].orderNumber,
        "orderId" : order[0].orderNumber,
        "orderDate" : order[0].orderDate,
        "productId" : order[0].productId,
        "productTitle" : currentProduct["productTitle"],
        "productImageUrl" : currentProduct["productImageUrl"],
        "productUrl" : currentProduct["productUrl"]
      }
    }
    else { obj = ""; }
    return obj;
  })
  .catch(err => console.log(err));
  }
};

...

  collectionOrders.find({})
  .then(orders => Promise.all(orders.map(order => processOrder(order))))
  .then(orders => Promise.all(orders.map(order => decorateProducts(order))))
  .then(orders => writeCsv(orders))
  .then(output => res.send(output))
  .catch(err => console.log(err));

任何帮助,将不胜感激。

这是因为在decorateProducts内部,您正在返回一个对象。 尝试返回一个Promise以便该对象仍可修复。

const decorateProducts = (order) => {
  if (typeof order[0] !== 'undefined' && order[0] !== null) {
    var prodId = order[0].productId;
    return collectionProducts.findOne({"_id": prodId})
      .then(currentProduct => {
        if (currentProduct) {
          var obj = { /* stuff */ }
        }
        else { obj = ""; }
      return Promise.resolve(obj);
    })
      .catch(err => console.log(err));
  }
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM