【问题标题】:Business logic works but Mongoose save doesn't业务逻辑有效,但 Mongoose save 无效
【发布时间】:2019-03-10 11:40:21
【问题描述】:

您好,我正在尝试将购物车应用中的数据保存到 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 }));
}

【问题讨论】:

  • 您没有从用户而不是产品获取数据
  • 您好,产品对象在用户模型中,如上所示。

标签: node.js mongodb mongoose


【解决方案1】:

所以我基本上用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 }));
}

【讨论】:

    猜你喜欢
    • 2012-11-15
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多