使用Backendless搭建电商网站时购物车数据跨用户重复显示问题
问题原因与解决方案
问题根源
你的代码调用Backendless.Data.of("Cart").find()时没有添加用户隔离的过滤条件,会返回数据库中所有用户的购物车数据,而且直接取返回结果的第一条response[0],自然会把其他用户的商品加载到当前用户的购物车里。
修复步骤
给Cart表添加用户关联字段
在Backendless控制台的Cart表中新增userID字段(字符串类型),用来关联每个购物车所属的用户ID。修改购物车查询逻辑(displayCart)
查询时只获取当前登录用户的购物车数据,先拿到当前用户的ID,再通过where条件过滤:
const [cartProduct, setcartProduct] = useState([]); function displayCart() { // 获取当前登录用户的ID const currentUser = Backendless.UserService.getCurrentUser(); if (!currentUser) { console.log("用户未登录"); setcartProduct([]); return; } const query = { where: `userID = '${currentUser.objectId}'` }; Backendless.Data.of("Cart") .find(query) .then((response) => { if (response.length >= 1) { // 只加载当前用户的购物车商品 setcartProduct([...response[0].productID]); } else { // 没有购物车记录时清空状态 setcartProduct([]); } }) .catch((err) => console.log(err)); }
- 修改购物车保存逻辑(saveCart)
保存时先查询当前用户的购物车,创建新购物车时带上userID字段,确保数据归属正确:
function saveCart() { const currentUser = Backendless.UserService.getCurrentUser(); if (!currentUser) { console.log("用户未登录,无法保存购物车"); return; } const query = { where: `userID = '${currentUser.objectId}'` }; Backendless.Data.of("Cart") .find(query) .then((res) => { if (res.length < 1) { // 首次创建购物车,关联当前用户ID Backendless.Data.of("Cart") .save({ productID: cartProduct, userID: currentUser.objectId }) .then((response) => console.log("购物车已创建")) .catch((err) => console.log(err)); } else { // 更新现有购物车,仅操作当前用户的记录 Backendless.Data.of("Cart") .save({ objectId: res[0].objectId, productID: [...res[0].productID, ...cartProduct], userID: currentUser.objectId }) .then((res) => { setcartProduct(res.productID); }) .catch((err) => console.log(err)); } }) .catch((error) => { console.error(error); }); }
额外提示
- 确保用户登录后才能访问购物车功能,避免未登录状态下的无效操作。
- 可以给Cart表的
userID字段添加索引,提升查询效率。
内容的提问来源于stack exchange,提问作者Olena
相关产品推荐
相关产品推荐

