使用if-else逻辑时setDoc()与updateDoc()函数报错问题
解决购物车添加商品时的TypeError问题
问题原因
报错TypeError: Cannot read properties of undefined (reading 'quantity')是因为已存在的商品文档中缺少quantity字段,或者字段值为undefined,当执行productDoc.data().quantity + 1时,就会触发该错误。另外注意:Firebase 9中DocumentSnapshot判断文档存在要用exists()方法,而非exists属性,原代码这里也存在潜在问题。
修复方案
方案1:快速修复——给quantity添加默认值
修改代码,用可选链和空值合并运算符处理字段不存在的情况,同时修正文档存在性判断的写法:
const productRef = doc(db, "carts", cartId, "cartProducts", this.productName); const productDoc = await getDoc(productRef); if (productDoc.exists()) { const currentData = productDoc.data(); await updateDoc(productRef, { quantity: (currentData?.quantity ?? 0) + 1 }); } else { // 确保新文档必带quantity字段,默认值为1 await setDoc(productRef, { ...product, quantity: product.quantity ?? 1 }); }
方案2:推荐方案——使用Firebase事务
购物车数量增减属于典型的并发操作场景,用事务能避免多用户同时操作导致的数量不一致问题:
const productRef = doc(db, "carts", cartId, "cartProducts", this.productName); await runTransaction(db, async (transaction) => { const productDoc = await transaction.get(productRef); if (productDoc.exists()) { const currentQuantity = productDoc.data()?.quantity ?? 0; transaction.update(productRef, { quantity: currentQuantity + 1 }); } else { transaction.set(productRef, { ...product, quantity: product.quantity ?? 1 }); } });
额外检查点
- 排查已存在的商品文档,确保所有文档都包含
quantity字段,若有缺失可批量补全。 - 确认
this.productName的值准确,避免因命名错误匹配到异常文档。
内容的提问来源于stack exchange,提问作者VolodymyrPTK
相关产品推荐
相关产品推荐

