You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:03:30