Node.js 业务逻辑起作用,但Mongoose save不起作用;T

Node.js 业务逻辑起作用,但Mongoose save不起作用;T,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,嗨,我正在尝试将数据从我的购物车应用程序保存到MongoDB数据库。在我的购物车控制器文件夹中,有getAllProducts、addOneProduct、removeOneProduct和updateOneProducts方法。除了updateOneProducts之外,它们都运行得非常好 console.log显示: 获取所有产品{id:[1,2,4],数量:[1,1,1]} 更新一个产品{id:[1,2,4],数量:[1,1,2]} 这表明业务逻辑工作正常。但是,该文件未在mLab上更新

嗨,我正在尝试将数据从我的购物车应用程序保存到MongoDB数据库。在我的购物车控制器文件夹中,有
getAllProducts
addOneProduct
removeOneProduct
updateOneProducts
方法。除了
updateOneProducts
之外,它们都运行得非常好

console.log显示:

获取所有产品{id:[1,2,4],数量:[1,1,1]}

更新一个产品{id:[1,2,4],数量:[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;
更新产品

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 }));
}

所以我基本上克隆了user.products.qty数组,使用
constqty=[…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 }));
}

您不是从用户而不是从productHi获取数据,product对象位于如上所示的用户模型中。