React Native从Firebase数组获取数据:用户邮箱获取失败求助
如何通过Firebase Auth当前用户ID获取
tutorCopy中的用户邮箱 我来帮你分析下之前两种方法的问题,然后给出正确的实现方案:
先看你之前代码的问题
第一种Promise方法的错误
firebase.database().ref().on('value')是实时监听数据变化的方法,它返回的是一个用于取消监听的函数,而不是Promise对象。所以你用Promise.all去处理这些“伪Promise”肯定不会生效。- 就算你改成返回Promise的
once('value'),回调里的变量也混乱了:then(user => ...)里的user是Promise的结果数组,但你后面用的s根本没定义,逻辑完全不对。
第二种快照方法的错误
你写了.child('user'),这里应该传入当前用户的UID变量(也就是你定义的user),而不是字符串'user'!这就导致你一直在访问tutorCopy/user这个不存在的节点,自然拿不到数据。
正确的实现方式
方式1:单次获取邮箱(用Promise + once)
适合只需要获取一次邮箱的场景,代码更简洁:
componentWillMount() { // 先确认用户已完成Auth初始化 const currentUser = firebase.auth().currentUser; if (!currentUser) { console.log("用户未登录或Auth尚未初始化"); return; } const userId = currentUser.uid; // 直接定位到当前用户的useremail字段 firebase.database().ref(`tutorCopy/${userId}/useremail`) .once('value') .then(snapshot => { const userEmail = snapshot.val(); if (userEmail) { // 根据你的需求更新state,这里假设markers用来存储邮箱 this.setState({ markers: userEmail }); } else { console.log("该用户的邮箱未存储在数据库中"); } }) .catch(error => { console.error("获取邮箱失败:", error); }); }
方式2:实时监听邮箱变化
如果需要数据库中邮箱更新时,组件自动同步最新值,可以用on('value')监听:
componentWillMount() { // 监听Auth状态,确保用户登录后再操作 this.authStateListener = firebase.auth().onAuthStateChanged(user => { if (user) { const userId = user.uid; const emailRef = firebase.database().ref(`tutorCopy/${userId}/useremail`); // 实时监听邮箱变化 this.emailListener = emailRef.on('value', snapshot => { const userEmail = snapshot.val(); this.setState({ markers: userEmail }); }, error => { console.error("监听邮箱失败:", error); }); } else { console.log("用户未登录"); } }); } // 组件卸载时取消监听,避免内存泄漏 componentWillUnmount() { if (this.authStateListener) this.authStateListener(); if (this.emailListener) this.emailListener(); }
重要注意事项
- 数据库权限规则:确保你的Firebase数据库规则允许当前用户访问自己的邮箱数据,比如可以设置这样的规则:
{ "rules": { "tutorCopy": { "$userId": { ".read": "$userId === auth.uid", ".write": "$userId === auth.uid" } } } }
- 处理Auth初始化延迟:有时候组件挂载时,Firebase Auth还没完成初始化,
currentUser会是null。上面的方式2用onAuthStateChanged监听状态变化,能完美解决这个问题。
内容的提问来源于stack exchange,提问作者Talha Nadeem
相关产品推荐
相关产品推荐

