Добавление объекта в Array of Objects, Nodejs, Mongoose - PullRequest
0 голосов
/ 29 января 2019

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

У меня есть маршрут для добавления указанного товара в корзину, и он работает нормально.Однако, когда я добавляю его, все, что отображается в массиве, - это _id продукта, а то, что я ищу, - это объект, содержащий некоторую информацию (например, имя продукта, цена продукта и т. Д.).Чтобы я мог получить к нему доступ позже в моем приложении React-Redux.Я нашел несколько предложений в Интернете, но они, кажется, вообще не работают для меня или дают мне то же самое, что и я.

Вот маршрут:

Cart.findOne({ user: req.user.id })
      .then(cart => {
        Product.findById(req.params.product_id).then(product => {
          const newItem = {}
          newItem._id = product._id; 
          newItem.name = product.name;
          newItem.price = product.price;
          const total =
            parseFloat(cart.total) + parseFloat(product.price);
          cart.total = Math.round(total*100)/100;


          cart.items.push(newItem);
          cart.save().then(cart=> res.json(cart));
        });
      })
      .catch(err => res.status(404).json(err));
  })
  .catch(err => res.status(404).json(err));

Вот соответствующая схема:

        const CartSchema = new Schema({
      user: {
        type: Schema.Types.ObjectId,
        ref: "users"
      },
      total: {
        type: String,
        default: 0
      },
      items: [
        {
          product: {
            type: Schema.Types.ObjectId,
            ref: "product"
          }
        }
      ]
    });

Любая помощь будет принята с благодарностью.Спасибо

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Как насчет

const CartSchema = new Schema({
    user: {
        type: Schema.Types.ObjectId,
        ref: "users"
    },
    total: {
        type: String,
        default: 0
    },
    items: [
        {
            type: Schema.Types.ObjectId,
            ref: "product"
        }
    ]
});

И элемент, помещаемый в массив элементов, должен быть экземпляром Product, а не просто объектом.

0 голосов
/ 29 января 2019

Попробуйте передать продукт как есть.Возможно, из-за схемы mongoose ожидает Product, а не универсальный объект, такой как, в вашем случае, newItem

Cart.findOne({ user: req.user.id }).then(cart => {
  return Product.findById(req.params.product_id);
}).then(product => {
  const total = parseFloat(cart.total) + parseFloat(product.price);
  cart.total = Math.round(total*100)/100;
  cart.items.push(product);
  return cart.save();
}).then(cart => {
  return res.json(cart)
}).catch(err => res.status(404).json(err));

ПРИМЕЧАНИЕ: я также немного исправил структуру вашей цепочки обещаний.Таким образом вы избежите ада обратного вызова и вам понадобится только один оператор catch для всей цепочки обещаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...