javascript - session 中的数据未添加,但在客户端测试时会重新创建

标签 javascript vue.js session

这件事在服务器端对我来说工作得很好, session 成功地将数据添加到购物车中,因为它应该。但在客户端(我使用的是 axios) session 不断被重新创建。通过重新创建数据,我的意思是,例如,当我尝试在购物车中添加更多商品时,整个时间数量仍然为 1,并且会不断地使用最后一个商品重新创建数据。

这是我使用 session 的文件:

app.use(session({
    secret: "hideSession",
    resave: true,
    saveUninitialized: true,
    cookie: {
        sameSite: true,
        httpOnly: false,
    }
  }));

整个add_to_cart路线请求:

app.post("/add_to_cart/:name", async (req, res) => {

    let db = await connect();
    let cursor = await db.collection("products").find({})
    let finalData = await cursor.toArray();
    const name= req.params.name;

    const singleDrink = await finalData.find((product) => product.name === name);
    let cart;
    if (!req.session.cart) req.session.cart = cart = new Cart({});

    else cart = new Cart(req.session.cart);

    req.session.cart = cart;
    cart.addDrink(singleDrink);
    console.log(req.session.cart,req.session.cookie)
    res.send(cart);
});  

客户端使用axios:

let Cart = {
    addToCart(name){
            return Service.post(`/add_to_cart/${name}`)
        }
    }

来自 axios 的客户端传递函数:

async sendCartData(name){
                Cart.addToCart(name);
            }

和按钮:

<p @click="sendCartData(item.name)" class="btn btn-default add-to-cart"><i class="fa fa-shopping-cart"></i>Add to cart</p>

这是购物车文件:

module.exports = function Cart(oldCart) {
    this.products = oldCart.products || {};
    this.totalQty = oldCart.totalQty || 0;
    this.totalPrice = oldCart.totalPrice || 0.00;
  
    this.addDrink = function(item) {
      let storeItem = this.products;
      if (!storeItem.hasOwnProperty("item")) {
        
        storeItem = this.products = {item: item};
        this.totalQty = 1;
        this.totalPrice = parseFloat(item.price);
  
      } else {
  
        storeItem = {item: item};
        this.products = storeItem;
        Object.defineProperties(storeItem, {
            currentQty: {
                enumerable: false,
                writable: true
            },
            price: {
                enumerable: false,
                writable: true
            }
        },
        
        );
        storeItem.currentQty++;
        storeItem.price = parseFloat(storeItem.item.price * storeItem.currentQty);
        this.totalQty++;
        this.totalPrice += parseFloat(storeItem.item.price);
      }
    }
  }

最佳答案

我有一个理论,所以不确定这是否是您遇到的问题。

您似乎使用默认的 session 存储,即 MemoryStore。使用此存储,如果应用程序因异常等原因重新启动,内存中的 session 将丢失。

在这种情况下,您的测试 if (!req.session.cart) 为 true,然后重新创建 session 。

要验证这一点,请检查错误日志。

并且还将 session 存储更改为磁盘持久存储。您可以在这里找到一个列表:https://www.npmjs.com/package/express-session#compatible-session-stores

如果您想获得内存存储的性能和磁盘持久存储的安全性,请查看此列表中的 loki.js:https://www.npmjs.com/package/connect-loki

关于javascript - session 中的数据未添加,但在客户端测试时会重新创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73323888/

相关文章:

javascript - 依次解决 Promise 会导致错误

android - Facebook SDK 3.0 : Unable to call openForPublish after the during a session state CLOSED_LOGIN_FAILED

Django 基于文件的 session 不会过期

session - Mongoose-Auth/Express/Connect 不保留 session 问题

javascript - 如何限制用户在移动字段中只能输入10个字符

javascript - Plyr视频播放器: How to expose/access multiple players?

vue.js - Vuetify 中的垂直 v-toggle-btn

vue.js - 无法读取未定义的属性 'length'”

javascript - 使用 ui-router 时如何去掉/#/?

javascript - 在回调方法中传递动态值