Quiero "sobrescribir" mi carrito. Obtengo la información que quiero, pero el problema es que no puedo obtener la información de mi carrito anterior. No entiendo cómo no se puede recuperar correctamente. Y todo el tiempo obtengo una cantidad de 1.
Aquí está la solicitud app.post:
app.post("/add-to-cart/:id", async (req, res) => { try { // fetch your data const id = req.params.id, { data } = await axios.get("http://localhost:4200/products"), singleProduct = await data.find((product) => product._id === id); // create/get a cart let cart; if (!req.session.cart) { req.session.cart = cart = new Cart({}); } else { // req.session does not save the Cart object, but saves it as JSON objects cart = new Cart(req.session.cart ? req.session.cart : {}); } console.log("This is variable cart: ",cart) cart.addProduct(singleProduct); res.redirect("/"); console.log(req.session) } catch (error) { console.log(error); } }); Parece que algo anda mal aquí: let cart = new Cart(req.body.cart ? req.body.cart : {});
Así que esta es la salida de console.log :
Este es el código del Cart :
module.exports = function Cart(oldCart) { this.productItems = oldCart.productItems || {}; this.totalQty = oldCart.totalQty || 0.00; this.totalPrice = oldCart.totalPrice || 0.00; this.addProduct = function(item) { let storedItem = this.productItems; if (!storedItem){ storedItem = this.productItems = {item: item, qty: 0, price: 0}; } else{ storedItem.qty++; this.totalQty ++; storedItem = {item: item, qty: storedItem.qty, price: storedItem.price} storedItem.price = storedItem.item.price * storedItem.qty; console.log("item from database",storedItem) this.totalPrice += storedItem.item.price; } } };Puede usar el paquete express-session para almacenar datos de sesión en el lado del servidor por sesión/usuario:
const session = require("express-session"); app.use(session({ secret: "some secret" })); app.post("/add-to-cart/:id", async (req, res) => { try { // fetch your data const id = req.params.id, { data } = await axios.get("http://localhost:4200/products"), singleProduct = await data.find((product) => product._id === id); // create/get a cart let cart; if (!req.session.cart) { cart = new Cart({}); } else { // req.session does not save the Cart object, but saves it as JSON objects cart = new Cart(req.session.cart); } req.session.cart = cart; cart.addProduct(singleProduct); res.redirect("/"); } catch (error) { console.log(error); } });Luego, si el cliente necesita obtener los datos del carrito, puede crear una ruta para eso:
app.get("/get-cart", (req, res) => { const cartData = req.session.cart || {}; res.send(JSON.stringify(cartData)); }); En el código que proporcionó, también noté algunos problemas con su clase Cart .
Al configurar los valores predeterminados de totalQty y totalPrice , utiliza oldCart.totalQty || oldCart.totalQty==0.00 , que lo establecerá en totalQty , o un booleano que verifica si totalQty es 0.00 .
Además, su función storedItem verifica si el elemento almacenado es falso/verdadero, lo cual siempre será verdadero (valor predeterminado = {} ), da como resultado que su lógica use un objeto vacío para su elemento y genere errores prop of undefined .
Para arreglar esto: haz algo como:
module.exports = function Cart(oldCart) { this.productItems = oldCart.productItems || {}; this.totalQty = oldCart.totalQty || 0; this.totalPrice = oldCart.totalPrice || 0.00; this.addProduct = function(item) { let storedItem = this.productItems; if (!storedItem.hasOwnProperty("item")) { storedItem = this.productItems = {item: item, qty: 1, price: item.price}; this.totalQty = 1; this.totalPrice = item.price; } else { storedItem = {item: item, qty: storedItem.qty, price: storedItem.price}; console.log("STORED ITEM: ", storedItem); this.productItems = storedItem; storedItem.qty++; storedItem.price = storedItem.item.price * storedItem.qty; this.totalQty++; this.totalPrice += storedItem.item.price; } } }