使用 MongoDB 和 Node JS 添加"add to cart"功能



我已经尝试了很多事情,但无法为"添加到购物车";特色你能帮我做这件事吗?

这是购物车型号:

var cartSchema = new mongoose.Schema({
owner: {type: mongoose.Schema.Types.ObjectID, ref: 'User'},
totalPrice: {type: Number, default: 0},
items: [{
item: {type: mongoose.Schema.Types.ObjectID, ref: 'Product'},
qty: {type: Number, default: 1},
price: {type: Number, default: 0}
}]})

这是产品型号:

var productSchema = new mongoose.Schema({
category: String,
name: String,
price: Number,
image: String,
description: String,
stock: Number,
reviews: [
{
type: mongoose.Schema.Types.ObjectID, ref: 'Review'
}
]
})

编辑(详细说明(:

步骤1:当我点击添加到购物车按钮时;得到";请求,并且应该发生以下事情:

  • 获取已登录用户的id,即req.user_id
  • 将单击的产品存储在购物车模型中的items数组中
  • 基于所需的产品数量,它应该计算价格,即数量*价格;价格;在购物车模型中的项目数组中

步骤2:当另一个产品添加到购物车时,它应该遵循步骤1中提到的所有步骤,除此之外,它还应该计算购物车的总价,即totalPrice=qty1xproduct1_price+qty2xproduct2_price+并将其存储在";totalPrice";在购物车模型中。

步骤3:当我点击查看购物车,即router.get("/cart"(时,这应该会把我带到购物车,它应该检查登录用户并显示属于该用户的购物车,也就是说,它应该查看cart.owner并向我显示购物车的所有详细信息。例如:(

  1. 短中的产品详细信息

  2. 数量

  3. 价格=数量x价格_产品

  4. 所有这些产品的最终总价

(

编辑3:

这里是添加到购物车按钮:

<form action="/product/<%= product._id %>/addCart" method="POST">
<select name="quantity">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button>Add to cart</button>
</form>

这是推车路线:

router.post("/product/:id/addCart", async (req, res) => {
const quantity = req.body;
Product.findById(req.params.id, function(err, foundProduct){
if(err){
console.log(err);
}
const product = {
item: foundProduct._id,
qty: quantity,
price: foundProduct.price * quantity 
}
Cart.owner = req.user._id;
Cart.itmes.push(product);
Cart.save();
res.redirect("/cart");
})
})
router.get("/cart", function(req, res){
Cart.find({owner: req.user._id}, function(err, userCart){
if(err){
console.log(err);
}
const pPrice = userCart.items.map(p => p.price);
const totalPrice = pPrice.reduce((a, b) => a + b, 0);
userCart.totalPrice = totalPrice;
userCart.save()
res.render("cart", {cart: userCart});
})
})

显示Cannot POST /product/5f80569156202d0a624d35af/addCart

为了帮助您,这里有一个快速示例:

简单HTML:

Quantity :
<select id="quantity">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button id="btnOK">OK</button>

在您的前端JS中(我使用jQuery,因为它比普通JS更简单(:

$("#btnOK").click( () => {
const quantity = Number( $("#quantity").val());
const productData = {
id : "123456",
quantity,
price : quantity * 20
}
$.post( "/product" , productData, result => {
console.log("Response from Node : ", result)
})
})

在您的后端JS:

router.post("/product", async (req, res) => {
const productData = req.body;
const result = await (new productModel(productData)).save();
res.send(result)
})

如果你想返回几个项目的价格总和,你不需要汇总。你可以把产品拿出来,然后把它们的价格加起来。例如:

const idArray = ["1", "3", "18", "27"]
// This should return 4 products :
const products = await productModel.find({
_id: {
$in: idArray
}
})
.lean()
.exec()

const totalPrice = products
.map( p => p.price)
.reduce((a, b) => a + b, 0)
res.send(totalPrice)

相关内容

最新更新