Инструменты пользователя

Инструменты сайта


nodejs:mongo:udalenie_iz_korziny

удаление из корзины

routes/card.js

const {Router} = require('express');//или const express.Router = require('express'); - модуль express
//const Card = require('../models/card');
const Course = require('../models/course');
 
const router = Router();
 
/**
 * Преоброзовать массив
 * @param cart
 * @returns {{count: *}[]}
 */
function mapCartItems(cart){
    return cart.items.map(c => ({//Обежим массив и вернем его в нужном виде
        ...c.courseId._doc, count:c.count
    }));
}
 
//посчитать итоговую стоимость
function computePrice(courses){
    return courses.reduce((total, course) => {//обежим массив и вернем  итоговую стоимость
        return total += course.price* course.count;
    }, 0);//изначально total ставим в 0(параметр метода reduce)
}
 
 
/**
 * Удалить позицию в заказе
 * первый параметр адрес страницы, в данном случае используется префикс при регистрации ройтера,
 * с динамическим параметром id
 * второй параметр callback - обработчик запроса req - request , запрос от браузера
 */
router.delete('/remove/:id', async (req, res)=>{
 
 
    await req.user.removeFromCart(req.params.id);//Обращаемся к модели и удаляем позицию
    const user = await req.user.populate('cart.items.courseId').execPopulate();//Получить данные корзины, из таблицы user
    const courses = mapCartItems(user.cart);
    const cart = {
        courses, price: computePrice(courses)
    };
    res.status(200).json(cart);//возвращаем статус 200 и json строку
});
 
 
module.exports = router;//Экспортирум роутер

models/user.js

const {Schema, model} = require('mongoose');//подключаем из библиотеки монго,модульсоздания схемы - Schema,
// и модуль регистрации моделей - model
 
/**
 * Схема пользователя
 *
 * В табличке пользователя сразу встраиваем корзину
 * @type {*|Mongoose.Schema}
 */
const userSchema = new Schema({
    email: {//email
        type: String,
        required: true
    },
    name: { //Имя пользователя
        type: String, //строка
        required: true //поле обязательное
    },
    cart: { //Корзина
        items: [ //Позиции
            {
                count: { //колличество заказанных одинаковых курсов
                    type: Number, //тип число
                    required: true, //поле обязательно
                    default: 1
                },
                courseId: {
                    type: Schema.Types.ObjectId, //тип ObjectId
                    ref: 'Course', //связка с models/course.js
                    required: true //поле обязательно
                }
            }
        ]
    }
});
 
/**
 * Удалить позицию в заказе
 * @param id - идентификатор позиции
 * @returns {*}
 */
userSchema.methods.removeFromCart= function(id){
    let items = [...this.cart.items];//Вернет склонированный массив es6, равносильно this.cart.items,
    // метод позволяет избавится от мутаций
    //const items = this.card.items.concat();//Вернет склонированный массив,  равносильно this.cart.items,
    // метод позволяет избавится от мутаций
 
    const idx = items.findIndex(c => {//Ищем нужный курс по id
        return c.courseId.toString() === id.toString();
    });
 
    if(items[idx].count === 1) {//если кооличество одинаковых курсов в еденичном экземпляре
        items = items.filter( c =>  c.courseId.toString() !== id.toString() );//Удаляем нужный курс
    }
    else{
        items[idx].count--;//Уменьшаем колличество заказанных курсов
 
    }
 
   this.cart = {items};//переопределяем корзину
   return this.save()//сохраняем изменения
};
 
module.exports = model('User', userSchema); //Возврощаем схему, на нее можно вешать различные методы ,
// в частности update, save, delete и т.д.
nodejs/mongo/udalenie_iz_korziny.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)