Firebase匹配Book Id查询节点后更新时提示update不是函数如何解决?
问题解决办法
错误根因
报错的核心原因是调用对象错误:snapshot.val()返回的是对应节点存储数据的普通JavaScript序列化对象,仅包含数据内容,没有Firebase数据库操作方法。只有节点对应的Reference引用对象才支持update()更新操作。
修正代码
直接通过snapshot.ref获取当前匹配节点的引用,再执行更新即可,修正后代码如下:
let bookID = pickedFromPrintedOutBook; let bookCoverURL = pickedFromTextInputValue; firebase.database().ref('/Books/').orderByChild("Book Id").equalTo(bookID).once("child_added", function(snapshot){ // 改用snapshot.ref获取节点引用后调用update snapshot.ref.update({ "Cover": bookCoverURL }); })
补充优化建议
- 如果你的业务场景可能出现多个图书匹配同一个
Book Id的情况,建议改用value事件遍历所有匹配节点进行更新,避免遗漏:
firebase.database().ref('/Books/').orderByChild("Book Id").equalTo(bookID).once("value", function(snapshot){ snapshot.forEach(childSnapshot => { childSnapshot.ref.update({ "Cover": bookCoverURL }); }); })
- 可在
update后追加Promise回调捕获权限、网络等原因导致的更新失败问题,方便排查:
snapshot.ref.update({ "Cover": bookCoverURL }).then(() => { console.log("封面更新成功"); }).catch(err => { console.error("封面更新失败:", err); })
内容的提问来源于stack exchange,提问作者Ben Kenny
相关产品推荐
相关产品推荐

