JavaScript中Firebase子节点值获取失败,权限跳转功能异常
解决Firebase数据库子节点值获取失败导致权限跳转失效的问题
嘿,我帮你揪出问题所在啦!你的代码里有两个核心问题,导致没法正确获取用户的Role字段来做跳转判断:
问题1:错误地把查询对象当作布尔值判断
你现在写的if (adaRef.orderByChild("Role").equalTo("admin"))只是创建了一个Firebase查询对象,并没有真正发起请求去数据库拉取数据。在JavaScript里,对象本身是“真值”,所以这个条件永远会成立,不管用户实际角色是什么,都会跳去DB.html。
问题2:缺少异步数据获取的处理
Firebase的数据库操作都是异步的,你不能直接同步获取数据,必须通过回调或者Promise来处理返回的快照数据。
修正后的代码
我给你调整了代码,加上了正确的异步数据获取逻辑,还补了一些边界处理:
function sontinue() { // 先确认用户已登录,避免uid为空的情况 var user = firebase.auth().currentUser; if (!user) { location.href = "index.html"; return; } var uid = user.uid; var userRef = firebase.database().ref("User/" + uid); // 用once('value')单次获取用户数据快照 userRef.once('value').then(function(snapshot) { var userData = snapshot.val(); // 确认数据存在且Role匹配admin if (userData && userData.Role === "admin") { location.href = "DB.html"; } else { location.href = "index.html"; } }).catch(function(error) { // 处理数据读取失败的情况(比如权限不足) console.error("读取用户数据出错:", error); location.href = "index.html"; }); }
额外需要检查的点
- 数据库安全规则:确保你的Firebase数据库规则允许已登录用户读取自己的节点,比如:
{ "rules": { "User": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
如果规则设置不对,会导致数据读取失败,控制台会有报错。
- 数据库节点结构:确认
User/[你的用户uid]节点下确实存在Role字段,并且值是字符串"admin"(注意大小写!Firebase是大小写敏感的,比如Admin和admin会被当作不同值)。
内容的提问来源于stack exchange,提问作者Arfandra Rezky
相关产品推荐
相关产品推荐

