React Native集成Firebase时如何获取当前用户并更新对应数据库字段
错误原因
你的写法存在两个核心问题:
where()条件查询返回的是集合查询对象,调用get()后拿到的是QuerySnapshot类型的集合查询结果,不是单个文档对象,无法直接调用update方法get()是异步方法,你没有加await等待查询返回结果,直接对Promise对象调用update会直接报错
修复方案(适配现有数据库结构)
你的数据库结构如下:
按照你现有的集合结构,正确写法如下:
const friendadd = async() => { // 先校验登录状态 const currentUser = firebase.auth().currentUser if (!currentUser) return try { // 等待查询完成,拿到集合查询结果 const querySnapshot = await firebase.firestore() .collection('users') .where("UID", "==", currentUser.uid) .get() // 取出匹配的用户文档 if (!querySnapshot.empty) { // UID唯一,只会有一个匹配文档 const userDocRef = querySnapshot.docs[0].ref // 执行更新 await userDocRef.update({ "FriendsList.yVHnHIqhsOYbVbWOM6TbjpU4N3x1": true }) } } catch (err) { // 可自行处理异常,比如权限不足、网络错误等 console.log('更新好友列表失败', err) } } friendadd()
更优实现方案
你提到硬编码文档ID可以更新成功,说明你当前users集合的文档ID是随机生成的,不是用户的auth UID。建议你后续创建用户文档时,直接把用户的auth UID作为文档ID,这样不需要走查询逻辑,直接通过文档ID获取引用,性能更高、代码更简洁:
const friendadd = async() => { const currentUser = firebase.auth().currentUser if (!currentUser) return try { // 直接用auth UID作为文档ID获取引用,不需要查询 await firebase.firestore() .collection('users') .doc(currentUser.uid) .update({ "FriendsList.yVHnHIqhsOYbVbWOM6TbjpU4N3x1": true }) } catch (err) { console.log('更新好友列表失败', err) } }
注意事项
- 确保Firestore权限规则允许当前用户修改自己的用户文档,避免出现权限拒绝错误
- 加好友逻辑建议做双向校验,避免重复添加、添加不存在的用户等异常情况
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

