express - Express/Mongo - 更新 cartItems 数量
问题描述
我是使用 express 和 mongoose 的初学者。截至目前,我正在创建一个 3 天前开始的电子商务项目。我在向后端 REST API 添加数量时遇到问题,对代码进行故障排除。你能帮我弄清楚这件事吗?先感谢您
推车型号:
const mongoose = require('mongoose');
const cartSchema = new mongoose.Schema({
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true},
cartItems: [
{
product_id: { type: mongoose.Schema.Types.ObjectId, ref: 'Product', required: true}, // This foreign key to product _id
quantity: {type: Number, default: 1, required: true},
price: {type: Number, required: true}
}
]
}, {timestamps: true});
module.exports = mongoose.model('Cart', cartSchema);
我的路由器:
const express = require('express');
const { addItemToCart } = require('../controller/controller_cart.js');
const router = express.Router();
router.post('/user/cart/addtocart', addItemToCart );
module.exports = router;
我的控制器:
const Cart = require("../models/model_cart.js");
exports.addItemToCart = (req, res) => {
Cart.findOne({ user: req.user._id }).exec((error, cart) => {
if (error) return res.status(400).json({ error });
if (cart) {
const product_id = req.body.cartItems.product_id;
const item = cart.cartItems.find((c) => c.product_id == product_id);
if (item) {
Cart.findOneAndUpdate(
{ user: req.user._id, "cartItems.product_id": product_id },
{
$cartItems: {
...req.body.cartItems,
quantity: item.quantity + req.body.cartItems.quantity
},
}
).exec((error, _cart) => {
if (error) return res.status(400).json({ error });
if (_cart) {
return res.status(201).json({ cart: _cart });
}
});
// if user cart does't exist create a list of cart for the user
} else {
Cart.findOneAndUpdate(
{ user: req.user._id },
{
$push: {
cartItems: req.body.cartItems,
},
}
).exec((error, _cart) => {
if (error) return res.status(400).json({ error });
if (_cart) {
return res.status(201).json({ cart: _cart });
}
});
}
} else {
// if cart not exist create a new cart
const cart = new Cart({
user: req.user._id,
cartItems: req.body.cartItems,
});
cart.save((error, cart) => {
if (error) return res.status(400).json({ error });
if (cart) {
return res.status(200).json({ cart });
}
});
}
});
};
响应:
{
"cart": {
"_id": "606d5eb292811a0a849a1df8",
"user": "606ad588d3ab5819b8e33a00",
"cartItems": [
{
"quantity": 1,
"_id": "606d5eb292811a0a849a1df9",
"product_id": "606c3c7e5c932b33d49b2d05",
"price": 4142
},
{
"quantity": 1,
"_id": "606d5eb492811a0a849a1dfa",
"product_id": "606c3c7e5c932b33d49b2d05",
"price": 4142
}
],
"createdAt": "2021-04-07T07:26:42.867Z",
"updatedAt": "2021-04-07T07:26:44.362Z",
"__v": 0
}
}
响应应该添加数量而不是创建另一个数组。
解决方案
尝试cartItems.$
代替 $cartItems:
在你的控制器中
推荐阅读
- elasticsearch - 更新嵌套字符串字段
- python - 为随机输入生成随机多项式
- r - 使用 R 在空字符串之后提取值
- apache - 如何在 CentOS/Fedora 中为“Let's Encrypt”SSL 证书设置自动更新?
- java - 使用 ArrayList 检索属性?
- reactjs - 如何用笑话模拟组件并保留组件名称
- database - 文本文件 (.txt) 作为数据库:最佳实践
- java - 在 ArrayList 中显示 0 的词频
- node.js - 为什么等待后 jest.fn() 不起作用?
- java - @Autowired Java @Configuration 文件中的类成员