繁体   English   中英

更新具有相同 id 的产品

[英]update products with the same id

我的产品可以选择尺寸,所以如果我将“X”产品添加到尺寸为 4 和 5 的购物车中,它将向购物车中添加 2 件商品,如下所示:

在此处输入图像描述

我的目标是当您成功从购物车中购买商品时,您刚购买的尺寸将从产品主页中删除。

仅当我尝试购买 2 种不同的物品时,它才有效。 如果我要尝试购买 2 件不同尺寸的相同商品,则只会过滤第一个尺寸的商品,我会收到此错误:

(node:21336) UnhandledPromiseRejectionWarning: VersionError: No matching document found for id "62bee4ce92e7c57a195686ae" version 0 modifiedPaths "size"

这是成功购买代码:

createOrder: async (_, {}, context) => {
      const userAuth = await auth(context);
      const cart = await Cart.findOne({ userId: userAuth._id });

      cart.cartProducts.forEach(async (p) => { // Here's the filtering product functionallity
        const products = await Product.findById(p.productId);
        if (products) {
          products.size = products.size.filter((s) => s !== +p.size);
        }
        await products.save();
      });

      if (!cart) {
        throw new UserInputError('No available order!');
      }

      const newOrder = new Order({
        orderProducts: cart.cartProducts,
        purchasedBy: userAuth._id,
        datePurchased: new Date().toISOString(),
      });

      await newOrder.save();

      return newOrder;
    },

正如我所说,它只有在您将 2 个不同的商品添加到您的购物车时才有效。

编辑:

现在我得到 product.save 不是一个函数

 const userAuth = await auth(context);
  const cart = await Cart.findOne({ userId: userAuth._id });
  const products = await Product.find({
    _id: cart.cartProducts.map((c) => c.productId),
  });

   cart.cartProducts.forEach(async (p) => {
    if (products) {
      products.map((product) => {
        return (product.size = product.size.filter(
          (size) => size !== +p.size
        ));
      });
    }
  });
  
  await products.save();

问题是您正在使用findById它将返回第一个匹配的文档。 这就是为什么当您在购物车中添加不同尺寸的相同产品时。 它将始终选择产品的第一个匹配 id。 您可以尝试使用 find 运算符,因为它返回匹配条件的列表。

Product.find({_id:p.productId});

它将返回所有产品,而不是仅匹配第一个产品。

暂无
暂无

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

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