#node.js #mongodb #mongoose
#node.js #mongodb #мангуст
Вопрос:
Я пробовал много вещей и не мог написать код для функции «добавить в корзину». Не могли бы вы помочь мне в этом?
Вот модель корзины:
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: когда я нажимаю кнопку «Добавить в корзину», она должна сделать запрос «получить», и должны произойти следующие вещи:
- получите идентификатор пользователя, вошедшего в систему, т.е. req.user._id
- храните выбранный товар внутри массива товаров в модели корзины
- на основе требуемого количества продукта он должен рассчитать цену, т.е. кол-во * цена, и сохранить ее в «цена» в массиве товаров в модели корзины
шаг 2: когда в корзину добавляется другой товар, он должен выполнить все шаги, упомянутые в шаге 1, и в дополнение к этому он должен рассчитать общую цену корзины, т.е. TotalPrice = qty1xproduct1_price qty2xproduct2_price …. и сохранить его в «TotalPrice» в модели корзины.
шаг 3: когда я нажимаю на просмотр корзины, т.Е. router.get («/ cart»), это должно привести меня в корзину, и она должна проверить наличие зарегистрированного пользователя и показать корзину, которая принадлежит этому пользователю, т.Е. Она должна проверить Cart.owner и показать мне все деталикорзина. Пример: (
-
краткие сведения о продукте
-
Количество
-
цена = кол-во x цена_пер_продукт
-
В итоге общая цена всех этих товаров
)
редактировать 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
Комментарии:
1.
res.redirect("/cart")
?2. Да, перенаправление («/ cart»)
3. Тогда проблема решена 🙂
4. Можете ли вы это объяснить ?!
5. Ну, вы спросили
It would redirect to "/cart" after adding the product
, вот и все.res.redirect("/cart")
, это ответ
Ответ №1:
Чтобы помочь вам, вот краткий пример :
Простой 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)