Firebase获取用户详情时出现Uncaught (in promise) TypeError错误求助
解决Firebase获取用户详情时的
Cannot read properties of null (reading 'indexOf')错误 错误核心原因
这个错误说明你代码里某个变量的值是null,但你尝试调用它的indexOf方法。结合你获取当前活跃用户信息的场景,大概率是以下两种情况:
- Firebase Auth返回的当前用户对象为
null(用户未登录),但后续代码直接用了该对象的属性并调用indexOf - 从
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
相关产品推荐
相关产品推荐

