从Firestore/Firebase获取当前用户数据时返回undefined如何解决
问题产生原因
- Firestore
users集合不存在对应当前登录用户uid的文档:Firebase Auth创建账号不会自动同步生成Firestore用户文档,需要开发者手动写入,若缺少这一步则对应文档不存在,data()直接返回undefined - Firestore安全规则拦截了读取请求:默认安全规则会拦截所有未配置权限的读写请求,且
get()方法在无权限时不会抛出错误,只会将返回的文档快照exists属性置为false,调用data()就返回undefined - 异步时序问题:调用
getCurrentUser方法时,Firebase Auth状态未完成初始化,导致实际传入的uid为空或和预期不一致,找不到对应文档
排查步骤
- 第一步:先打印文档快照的
exists属性判断文档是否可读
async getCurrentUser(){ const uid = firebase.auth().currentUser?.uid // 先确认当前uid正常 console.log('当前传入的uid', uid) const database = db.collection('users').doc(uid) const dbResults = await database.get() // 打印exists属性 console.log('文档是否存在/可读', dbResults.exists) console.log(dbResults.data()) }
如果exists返回false,继续下面的排查
- 第二步:登录Firebase控制台,进入Firestore数据库页面,查看
users集合下是否存在对应uid的文档,确认文档存在且字段正常 - 第三步:临时修改Firestore安全规则为测试规则,验证是否是权限问题:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
修改后如果能正常拿到data()返回值,说明是安全规则配置问题
解决方法
- 若为文档不存在问题:在用户注册成功的逻辑中,手动写入用户文档到
users集合:
// 注册示例代码 async register(email, password) { const userCredential = await firebase.auth().createUserWithEmailAndPassword(email, password) const uid = userCredential.user.uid // 手动写入用户文档 await db.collection('users').doc(uid).set({ uid, email, // 其他自定义用户字段 }) }
- 若为安全规则问题:调整安全规则,开放用户读取自身文档的权限:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; } } }
- 若为异步时序问题:通过Auth状态监听回调触发用户信息读取逻辑,避免Auth未初始化完成就调用接口:
// 页面初始化时添加监听 firebase.auth().onAuthStateChanged(user => { if (user) { // 认证完成后再调用获取用户信息的方法 getCurrentUser() } })
内容的提问来源于stack exchange,提问作者Prasanga Thapaliya
相关产品推荐
相关产品推荐

