这件事在服务器端对我来说工作得很好, 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/