Инструменты для создания функциональной корзины покупок

#node.js #reactjs #express #e-commerce

Вопрос:

Я создаю электронную коммерцию, используя Reactjs для интерфейса и Nodejs для бэкенда (также express), и я хочу создать корзину покупок, «подключенную» к учетной записи пользователя, где пользователь может пополнить страницу, закрыть ее, и корзина не сбрасывается. Я ищу инструменты для создания этого или какой-нибудь учебник, чтобы сделать это с помощью node-express, спасибо! (у меня еще нет кода, потому что я не знаю, с чего начать)

Ответ №1:

Это модель пользователя с корзиной( с функцией добавления в корзину и удаления из корзины )

 const mongoose = require("mongoose");

const Schema = mongoose.Schema;

const userSchema = new Schema({
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
  resetToken: String,
  resetTokenExpiration: Date,
  cart: {
    items: [
      {
        productId: {
          type: Schema.Types.ObjectId,
          ref: "Product",
          required: true,
        },
        quantity: {
          type: Number,
          required: true,
        },
      },
    ],
  },
});

userSchema.methods.addToCart = function (product) {
  const cartProductIndex = this.cart.items.findIndex((cp) => {
    return cp.productId.toString() === product._id.toString();
  });
  let newQuantity = 1;
  const updatedCartItems = [...this.cart.items];

  if (cartProductIndex >= 0) {
    newQuantity = this.cart.items[cartProductIndex].quantity   1;
    updatedCartItems[cartProductIndex].quantity = newQuantity;
  } else {
    updatedCartItems.push({
      productId: product._id,
      quantity: newQuantity,
    });
  }
  const updatedCart = {
    items: updatedCartItems,
  };
  this.cart = updatedCart;
  return this.save();
};

userSchema.methods.removeFromCart = function (productId) {
  const UpdatedCartItems = this.cart.items.filter((item) => {
    return item.productId.toString() !== productId.toString();
  });
  this.cart.items = UpdatedCartItems;
  return this.save();
};

userSchema.methods.clearCart = function () {
  this.cart = { items: [] };
  return this.save();
};

module.exports = mongoose.model("User", userSchema);
 

Здесь Маршруты

 router.get("/cart", (req, res, next) => {
  req.user
    .populate("cart.items.productId")
    .then((user) => {
      const products = user.cart.items;
      // console.log(products);
      res.render("home/cart", {
        path: "/cart",
        pageTitle: "Your cart",
        products: products,
        isAuthenticated: req.session.isLoggedIn,
      });
      // console.log(products);
    })
    .catch((err) => {
      console.error(err);
    });
});

router.post("/cart",(req, res, next) => {
  const prodId = req.body.productId;
  // console.log(prodId);
  Product.findById(prodId)
    .then((product) => {
      return req.user.addToCart(product);
    })
    .then((result) => {
      // console.log(result);
      res.redirect("/cart");
    });
});
 

Технологии:-

 Frontend:- Ejs View Engine
Backend:- Express, MongoDB Atlas