Firebase中向用户存储的数组推送对象无报错不生效如何解决
问题原因
- 你当前的代码仅在本地对从Firestore读取到的
saveditems数组执行了push操作,没有调用Firestore的写入接口将修改后的数组回写到数据库。Firestore不会自动同步本地对数据对象的修改,因此数据库内容不会更新,也不会触发报错。 - 现有先读取再修改的写法在多端同时操作时可能出现数组覆盖问题,更推荐使用Firestore内置的
arrayUnion原子化方法直接更新数组,无需提前读取文档。
修复方案
方案1:修改原有逻辑,新增写入步骤
function savetodb() { auth.onAuthStateChanged(user => { if(user) { const userDocRef = db.collection('users').doc(user.uid); userDocRef.get().then(doc => { // 新增兜底逻辑,避免数组不存在时报错 const saveditems1 = doc.data().saveditems || []; saveditems1.push({ Name:'Test', Price:'Test', Link:'https://www.test.com' }); // 新增回写数据库的逻辑 return userDocRef.update({ saveditems: saveditems1 }); }).catch(err => { // 新增错误捕获方便排查问题 console.error('数据更新失败:', err); }); } else { alert('no'); } }) }
方案2:更推荐的原子更新写法(无需提前读文档)
function savetodb() { auth.onAuthStateChanged(user => { if(user) { db.collection('users').doc(user.uid).update({ // 调用arrayUnion直接追加元素,自动原子化操作 saveditems: firebase.firestore.FieldValue.arrayUnion({ Name:'Test', Price:'Test', Link:'https://www.test.com' }) }).catch(err => { console.error('数据更新失败:', err); }); } else { alert('no'); } }) }
注意事项
- 如果你使用的是v9及以上版本的模块化Firebase SDK,
arrayUnion的导入和调用方式需要对应调整。 - 建议后续操作都增加错误捕获逻辑,权限问题、字段不存在等异常都可以快速定位。
内容的提问来源于stack exchange,提问作者Bob joe12
相关产品推荐
相关产品推荐

