业务逻辑有效,但猫鼬保存无效

时间:2019-03-09 09:36:44

标签: node.js mongodb mongoose

嗨,我正在尝试将购物车应用程序中的数据保存到MongoDB数据库中。在我的购物车控制器文件夹中,有getAllProductsaddOneProductremoveOneProductupdateOneProducts方法。除updateOneProducts以外,其他所有文件都运行正常。

console.log显示:

GET all product { id: [1,2,4], qty: [1,1,1] }

UPDATE one product { id: [1,2,4], qty: [1,1,2] }

表示业务逻辑有效。但是,该文档未在mLab上更新。

用户模型

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
  username: String,
  userID: String,
  picture: String,
  products: {
    id: [Number],
    qty: [Number],
  }
});

const Users = mongoose.model('User', userSchema);

module.exports = Users;

updateOneProduct

const extractProduct = (user) => {
  const product = {};
  product.id = user.products.id;
  product.qty = user.products.qty;

  return product;
}

// if user is logged in n changes the qty of a product, update the qty in database
const updateOneProduct = (req, res) => {
  // if (!req.user) return res.status(401).json({ error: 'Unauthorized' });
  const userId = req.user._id;
  const event = req.body.event;
  const productId = req.body.id;

  return Users.findById(userId)
              .then(user => {
                const qty = user.products.qty;
                const index = user.products.id.indexOf(productId);
                if (index === -1) {
                  throw new Error(`Product doesn't exist!`);
                }

                const regex = /^[0-9\b]+$/;
                if (event === 'plus') {
                  qty[index] += 1;
                } else if (event === 'minus') {
                  qty[index] -= 1;
                } else if (regex.test(event) && event !== '0') {
                  qty[index] = Number(event);
                }

                if (qty[index] === 0) {
                  user.products.id.splice(index, 1);
                  qty.splice(index, 1);
                }

                return user.save();
              })
              .then(user => {
                const product = extractProduct(user);
                console.log('UPDATE one product', product);
                return res.status(200).json(product);
              })
              .catch(error => res.status(400).json({ error }));
}

1 个答案:

答案 0 :(得分:0)

因此,我基本上用const qty = [...user.products.qty]克隆了user.products.qty数组,对其进行了操作,并使用user.products.qty = qty用它替换了user.products.qty。最后,我用return user.save()保存它。

由于某种原因,我无法变异子文档项目并保存它。我必须替换整个子文档user.products,然后保存才能正常工作。我认为这可能与PUT请求有关。

// if user is logged in n changes the qty of a product, update the qty in database
const updateOneProduct = (req, res) => {
  // if (!req.user) return res.status(401).json({ error: 'Unauthorized' });
  const userId = req.user._id;
  const event = req.body.event;
  const productId = req.body.id;

  return Users.findById(userId)
              .then(user => {
                const qty = [...user.products.qty];
                const index = user.products.id.indexOf(productId);
                if (index === -1) {
                  throw new Error(`Product doesn't exist!`);
                }

                const regex = /^[0-9\b]+$/;
                if (event === 'plus') {
                  qty[index] += 1;
                } else if (event === 'minus') {
                  qty[index] -= 1;
                } else if (regex.test(event) && event !== '0') {
                  qty[index] = Number(event);
                }

                if (qty[index] === 0) {
                  user.products.id.splice(index, 1);
                  qty.splice(index, 1);
                }

                user.products.qty = qty;

                return user.save();
              })
              .then(user => {
                console.log('UPDATE - After save promise', user.products);
                return res.status(200).json(user.products);
              })
              .catch(error => res.status(400).json({ error }));
}