добавьте функцию «добавить в корзину» с помощью mongodb и node js

#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 и показать мне все деталикорзина. Пример: (

  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

Комментарии:

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)