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

Firebase获取用户详情时出现Uncaught (in promise) TypeError错误求助

解决Firebase获取用户详情时的Cannot read properties of null (reading 'indexOf')错误

错误核心原因

这个错误说明你代码里某个变量的值是null,但你尝试调用它的indexOf方法。结合你获取当前活跃用户信息的场景,大概率是以下两种情况:

  1. Firebase Auth返回的当前用户对象为null(用户未登录),但后续代码直接用了该对象的属性并调用indexOf
  2. 从users集合查询到的文档数据为null,但代码尝试对其某个字段调用indexOf

分步解决方案

1. 先验证用户登录状态

在获取用户详情前,必须确认当前用户是否存在:

  • 示例(以Redux的authSlice为例):
// authslice.js中获取用户信息的异步逻辑
export const fetchUserDetails = createAsyncThunk(
  'auth/fetchUserDetails',
  async (_, { rejectWithValue }) => {
    const currentUser = firebase.auth().currentUser;
    // 先判断用户是否已登录
    if (!currentUser) {
      return rejectWithValue('用户未登录');
    }
    try {
      const userDoc = await firebase.firestore().collection('users').doc(currentUser.uid).get();
      if (userDoc.exists) {
        return userDoc.data();
      } else {
        return rejectWithValue('用户文档不存在');
      }
    } catch (err) {
      return rejectWithValue(err.message);
    }
  }
);

2. 排查所有indexOf调用位置

搜索代码里的indexOf,检查调用它的变量是否可能为null:

  • 比如有user.email.indexOf('@')这类代码时,先确保user.email不为null
  • 示例防护代码:
// MyProfile组件中使用用户数据时
const user = useSelector(state => state.auth.user);
if (!user) return <div>加载中...</div>;

// 对可能为空的字段做判断
const hasValidEmail = user.email ? user.email.indexOf('@') !== -1 : false;

3. 确保用户文档ID与Auth的UID匹配

对照你的users集合截图,确认文档ID是否是Firebase Auth用户的uid:

  • 如果文档ID不是用户UID,查询时会返回不存在的文档,导致数据为null
  • 创建用户文档时,必须用currentUser.uid作为文档ID,而非自定义ID或邮箱

4. 完善组件的加载与错误状态处理

在MyProfile组件中提前处理未就绪状态,避免渲染时访问空数据:

const { user, isLoading, error } = useSelector(state => state.auth);

if (isLoading) return <div>加载用户信息中...</div>;
if (error) return <div>获取失败:{error}</div>;
if (!user) return <div>请先登录</div>;

// 正常渲染用户信息
return (
  <div className="profile">
    <h1>{user.displayName}</h1>
    <p>{user.email}</p>
    {/* 其他用户信息字段 */}
  </div>
);

5. 检查Firestore安全规则

确保users集合的规则允许当前用户读取自己的文档:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

内容的提问来源于stack exchange,提问作者Just A Guy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:30:18