使用数组首个值从Firebase获取数据失败求助
看起来你遇到的问题是明明agent0的值能正常弹出,但用它作为Firebase节点路径时,始终拿不到对应的EmailList数据,返回null对吧?我来帮你排查几个常见的原因和解决方案:
检查节点路径的大小写与拼写一致性
Firebase的节点名称是大小写敏感的!比如你数组里的agent0是"ShanghaiAgent",但数据库里的节点是"shanghaiagent",这就会导致找不到对应数据。建议你用console.log(agent0)输出精确值,再和Firebase控制台里的节点名称逐字符核对,包括空格、特殊符号都要完全匹配。排查
agent0是否包含Firebase禁用的字符
Firebase不允许节点名称包含斜杠/、点.、美元符号$、井号#、方括号[]、换行符等特殊字符。如果agent0里有这些字符,会导致路径无效。你可以用console.log(encodeURIComponent(agent0))查看编码后的结果,判断是否有异常转义;或者直接在Firebase控制台确认对应节点的名称是否符合规则。验证数据库读取权限
有时候路径正确,但因为数据库规则限制没有读取权限,也会返回null。你可以临时将数据库规则改为开放读取(仅用于测试,测试后务必改回安全规则):{ "rules": { ".read": true, ".write": true } }如果修改后能正常获取数据,说明是权限问题,需要调整规则,允许当前用户读取
Forwarder Contact/All Origins/[agent0]路径下的数据。确认节点是否存在(先检查snapshot)
在获取EmailList之前,先判断snapshot本身是否存在,这样能区分是节点不存在还是EmailList字段缺失:var agent0 = agents[0]; window.alert(agent0); var refPullEmail = firebase.database().ref("Forwarder Contact").child("All Origins").child(agent0); refPullEmail.once("value") .then(function(snapshot) { if (snapshot.exists()) { var agentEmail_0 = snapshot.child("EmailList").val(); window.alert(agentEmail_0); } else { window.alert("找不到与agent0匹配的节点!"); } });如果弹出“找不到与agent0匹配的节点”,说明
agent0对应的节点在Firebase中不存在,需要核对agents数组的数据是否与数据库节点对应。检查
agents数组的数据类型
有可能agent0不是字符串类型,而是一个对象?比如agents数组里的元素是对象,你直接取agents[0]拿到的是整个对象,而非节点名称的字符串。这时候需要取对象中对应的属性,比如agents[0].agentName或agents[0].id(具体取决于你的数组结构)。可以用console.log(typeof agent0)查看类型,如果是object,就需要调整取值方式。
内容的提问来源于stack exchange,提问作者Sillenxy

