Firebase报错:Cannot read property 'uid' of null 原因排查
解决"Uncaught TypeError: Cannot read property 'uid' of null"错误的原因
这问题我之前开发Firebase应用时也碰到过,咱们一步步拆解原因:
直接触发错误的原因
你代码里的user = firebase.auth().currentUser拿到了null,这时候去访问user.uid自然就会抛出类型错误。Firebase的currentUser并不是页面一加载就会有值的:
- 如果用户还没登录,
currentUser就是null; - 就算用户之前登录过,页面刷新后Firebase需要一点时间来验证用户的会话状态,在这个初始化完成前,
currentUser也会是null。
为什么上方逻辑类似的代码能正常运行?
大概率是你上方的代码是放在Firebase Auth状态变更的回调里执行的,比如用了firebase.auth().onAuthStateChanged()监听。这个回调会在用户登录状态稳定后(包括页面刷新后初始化完成)才触发,这时候currentUser已经是有效的用户对象了。而你报错的checkForSession函数,应该是在Auth状态还没准备好的时候就被调用了(比如页面加载时直接执行,或者用户还没完成登录流程就触发了)。
快速修复方案
方案1:把逻辑放到Auth状态监听里
确保只有在用户登录状态就绪后才执行你的代码:
// 先监听Auth状态变化 firebase.auth().onAuthStateChanged(function(user) { if (user) { // 用户已登录/状态就绪,再调用你的函数 checkForSession(testNo); } else { // 处理用户未登录的情况,比如提示登录 console.log("请先登录哦~"); } }); function checkForSession(testNo) { // 这里的user已经是有效对象了,直接用就行 firebase.database().ref(`users/${user.uid}/tests/${testNo}`).on('value', function(snapshot) { const datas = snapshot.val(); hour = datas.lastActiveHour; minute = datas.lastActiveMinute; day = datas.lastActiveDay; // ... 你的其他业务代码 }); }
方案2:在函数内部先做判空处理
如果你的函数调用时机没法调整,就在函数里先检查user是否存在:
function checkForSession(testNo) { const user = firebase.auth().currentUser; // 先判断用户是否存在 if (!user) { console.error("用户未登录或Auth状态还没准备好"); return; // 终止执行,或者做其他降级处理 } // 确认user有效后再执行数据库操作 firebase.database().ref(`users/${user.uid}/tests/${testNo}`).on('value', function(snapshot) { const datas = snapshot.val(); hour = datas.lastActiveHour; minute = datas.lastActiveMinute; day = datas.lastActiveDay; // ... 你的其他业务代码 }); }
内容的提问来源于stack exchange,提问作者Benjamin Sommer
相关产品推荐
相关产品推荐

