React Native+Redux+Firebase:无法通过UID获取其他用户数据求助
解决React Native + Redux + Firebase中通过UID获取用户数据失败的问题
我来帮你梳理下问题所在,主要有两个核心问题:异步操作的时序错误,以及可能的数据库规则/数据结构细节问题,一步步帮你解决:
1. 首要问题:异步操作的时序错误
你的代码里犯了一个常见的异步逻辑错误:firebase.database().ref().on('value')是异步执行的,但你紧接着同步判断user !== undefined——这时候user还是初始的空对象,所以永远会走进else分支,触发错误提示。
另外,你这里只需要获取一次用户数据,不需要持续监听节点变化,用once('value')比on('value')更合适,配合async/await(Redux Thunk支持异步函数)能让逻辑更清晰:
修改后的action代码:
export const addUser = (enteredUid) => { const { currentUser } = firebase.auth(); return async (dispatch) => { // 先检查用户是否已登录 if (!currentUser) { dispatch({ type: GM_SET_ERROR, payload: 'Please log in to add users!' }); return; } try { // 异步获取目标用户数据 const userSnapshot = await firebase.database().ref(`users/${enteredUid}`).once('value'); const targetUser = userSnapshot.val(); if (targetUser) { // 将用户添加到当前用户的群组 await firebase.database().ref(`users/${currentUser.uid}/group/users`).push(targetUser); // 注意这里用targetUser.username,不是enteredUid.username(enteredUid是字符串) dispatch({ type: GM_SET_SUCCESS, payload: `User ${targetUser.username} added successfully!` }); } else { dispatch({ type: GM_SET_ERROR, payload: `User ${enteredUid} does not exist!` }); } } catch (error) { // 捕获权限错误或其他异常 dispatch({ type: GM_SET_ERROR, payload: `Failed to add user: ${error.message}` }); console.error('Add user error:', error); } }; };
2. 数据库规则与数据结构检查
你的当前规则中,users/$uid的.read设为true,理论上认证用户可以读取任意用户的节点,但有几个细节需要确认:
- 确认Firebase数据库中
users节点下的子节点key确实是用户的UID(不是自定义ID或其他字段)。比如注册用户时,应该用firebase.database().ref(users/${user.uid}).set({...用户数据}),确保key和UID完全一致。 - 如果需要读取整个
users节点(比如搜索用户),当前规则会拒绝访问,因为Firebase规则默认是"拒绝所有未明确允许的操作"。如果需要这个权限,可以修改规则为:{ "rules": { "users": { ".read": "auth != null", // 允许所有认证用户读取整个users节点 "$uid": { ".write": "$uid === auth.uid" // 只有用户自己能修改自己的数据 } } } }
额外检查点
- 确认输入的
enteredUid完全正确,没有拼写错误或大小写问题(Firebase的UID是区分大小写的)。 - 在Firebase控制台的实时数据库->规则页面,点击"发布"确保规则已经生效,有时候修改后忘记发布会导致规则不更新。
内容的提问来源于stack exchange,提问作者oisin097
相关产品推荐
相关产品推荐

