=====удаление из корзины===== **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 и т.д.