Firebase登录时获取存储用户信息失败,user返回undefined求助
问题分析与解决方案
看起来你遇到的核心问题是user.uid返回undefined,导致后续无法关联用户ID存储信息。咱们一步步排查:
1. 最可能的原因:错误获取用户ID
signInWithEmailAndPassword方法的then回调参数是UserCredential对象,而不是直接的User实例。你直接访问user.uid自然会得到undefined——正确的用户ID应该从userCredential.user.uid获取。
修正后的登录代码:
e.preventDefault(); fire.auth().signInWithEmailAndPassword(this.state.email, this.state.password).then((userCredential) => { const Username = this.state.username; // 这里改用userCredential.user.uid获取用户ID this.sendUserinfo(Username, userCredential.user.uid); }).catch((error) => { console.log("HJÄÄÄLP" ,error); });
2. 验证state中的username是否有效
在调用sendUserinfo之前,先打印this.state.username确认它不是undefined:
console.log("当前输入的用户名:", this.state.username);
如果输出是undefined,说明你的表单输入框没有正确绑定到state的username字段。需要检查输入框的onChange事件,确保它更新state:
// 示例输入框绑定方式 <input type="text" placeholder="用户名" value={this.state.username} onChange={(e) => this.setState({ username: e.target.value })} />
3. 检查sendUserinfo函数的实现
确保这个函数正确调用Firebase数据库(Firestore/实时数据库),并且包含错误处理逻辑,避免静默失败。举个Firestore的实现例子:
sendUserinfo = (username, uid) => { // 写入users集合,用用户ID作为文档ID fire.firestore().collection('users').doc(uid).set({ username: username }) .then(() => { console.log("用户信息存储成功!"); }) .catch((error) => { console.error("存储失败:", error); }); };
如果用实时数据库,代码类似:
sendUserinfo = (username, uid) => { fire.database().ref(`users/${uid}`).set({ username: username }) .then(() => { console.log("用户信息存储成功!"); }) .catch((error) => { console.error("存储失败:", error); }); };
4. 检查Firebase权限规则
如果以上都没问题,那可能是数据库权限不足。确保你的规则允许已登录用户写入自己的信息:
- Firestore规则示例:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
- 实时数据库规则示例:
{ "rules": { "users": { "$userId": { ".read": "$userId === auth.uid", ".write": "$userId === auth.uid" } } } }
按这个顺序排查,应该能解决用户信息无法创建的问题。
内容的提问来源于stack exchange,提问作者Hedvig
相关产品推荐
相关产品推荐

