ошибка при возврате данных foreach найти массив mongodb - PullRequest
0 голосов
/ 26 мая 2020

Я просматриваю документ и с результатом обращаюсь к другому model, но, в конце концов, мне ничего не возвращается, foreach не ждет await.

ShoppingCart.find({
   "userId": id
}).then(async ShoppingCart => {
   let distinctTypes = ShoppingCart[0].productsCart;
   distinctTypes.sort(function(r, u) {
      return r.manufacturerId > u.manufacturerId ? 1 : r.manufacturerId < u.manufacturerId ? -1 : 0
   });
   let products = [];
   let data2 = await distinctTypes.forEach(async function(thisType) {
      let id = thisType.productId;
      let data = await Product.findById(id).then(Product => {
         thisType.productId = Product;
         products.push(thisType);
         return products;
      });
      return data; ///at this point the information is correct
   });
   return data2;
});

«данные»: ноль

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Вы правы, что Array.prototype.forEach не ждет. Вместо этого вы должны использовать Array.prototype.map и Promise.all

ShoppingCart.find({
   "userId": id
}).then(async cart => {
   let distinctTypes = cart[0].productsCart;
   distinctTypes.sort(function(r, u) {
      return r.manufacturerId > u.manufacturerId ? 1 : r.manufacturerId < u.manufacturerId ? -1 : 0
   });
   const distinctTypesWithProducts = await Promise.all(
     distinctTypes.map(async function(thisType) {
        let id = thisType.productId;
        const product = await Product.findById(id)
        thisType.product = product // changed assignment of product to thisType.product
        return thisType
     });
   );
   return distinctTypesWithProducts;
});

. Вы можете упростить приведенное выше с помощью проекта , который я начал. Взносы приветствуются.

const { pipe, assign, map, get } = require('rubico')

// userId => cart
const findCartByUserID = userId => ShoppingCart.find({ userId })

// [distinctType] => [distinctType] sorted
const sortDistinctTypes = distinctTypes => distinctTypes.sort((r, u) => {
  return r.manufacturerId > u.manufacturerId ? 1 : r.manufacturerId < u.manufacturerId ? -1 : 0
})

// distinctType => distinctTypeWithProduct
const assignProduct = assign({
  product: pipe([
    get('productId'), // distinctType => productId
    Product.findById, // productId => product
  ]), // distinctType.product = product; return distinctType
})

// userId => [distinctTypeWithProduct, distinctTypeWithProduct, ...]
const getDistinctTypesWithProductFromUserID = pipe([
  findCartByUserID,
  // userId => cart

  get([0, 'productsCart']),
  // cart => distinctTypes

  sortDistinctTypes,
  // distinctTypes => sortedDistinctTypes

  map(assignProduct),
  // sortedDistinctTypes => [distinctTypeWithProduct, distinctTypeWithProduct, ...]
])

getDistinctTypesWithProductFromUserID(id)
0 голосов
/ 26 мая 2020

Это происходит потому, что forEach не выполняется синхронно. Вместо этого используйте For of l oop.

Подробный ответ: - Использование async / await с forEach l oop

...