Firebase数据库update()调用报错,前后提示矛盾困惑求助
我刚看完你的问题,这两个看似冲突的报错其实是因为你两次尝试的代码逻辑里踩了不同的坑——不是Firebase出尔反尔,而是你可能在第二次调整代码时,不小心把调用对象或者方法用错了!
先拆解第一个错误:要求传入对象
ERROR Error: Reference.update failed: First argument must be an object containing the children to replace.
这个是Firebase Realtime Database的update()方法的标准要求:当你在一个合法的Reference(数据库引用)上调用update()时,必须传入一个键值对对象,用来明确告诉Firebase你要更新哪个路径下的哪个值。比如你第一次调用时,大概率是直接传了数值this.voteCount,像这样:
// 错误示例:直接传数值给update() voteRef.update(this.voteCount);
这就触发了第一个报错,因为update()需要的是{ 路径: 值 }这样的结构。
再看第二个错误:不接受对象
ERROR Error: Expects a string, snapshot, or reference. Got: object
这个报错根本不是update()抛出的!它更像是你在创建数据库引用的时候,把对象传给了需要路径字符串的方法(比如ref()或者child())。举个例子,你第二次调整代码时可能写成了这样:
// 错误示例:把对象传给了ref(),而不是路径字符串 const wrongRef = firebase.database().ref({ voteCount: this.voteCount }); wrongRef.update(...); // 这时候ref本身就创建失败,后续调用自然报错
或者你可能误把对象传给了child()方法,比如voteRef.child({ voteCount: ... }),这也会触发这个错误——因为child()需要的是字符串路径,不是对象。
正确的用法示例
你需要确保两个关键点:
- 先获取合法的数据库引用(路径是字符串)
- 调用
update()时传入键值对对象
完整代码应该是这样的:
// 1. 获取指向你要更新节点的引用 const targetRef = firebase.database().ref('posts/123/vote'); // 这里的路径换成你的实际节点路径 // 2. 调用update,传入键值对对象 targetRef.update({ voteCount: this.voteCount }) .then(() => { console.log("投票数更新成功!"); }) .catch((error) => { console.error("更新失败:", error); });
总结一下
两次报错的矛盾点在于:
- 第一次是
update()的参数类型错误(传了数值而非对象) - 第二次是你在调整代码时,不小心把对象传给了创建引用的方法(比如
ref()/child()),而不是传给update()的参数
检查一下你的代码结构,确认调用update()的对象是合法的Reference,并且参数是正确的键值对对象,问题就能解决啦!
内容的提问来源于stack exchange,提问作者Simon

