使用Angularfire2在Firebase查询用户列表失败,遇.indexOn警告
解决Firebase查询警告及无法获取目标用户列表的问题
看起来你遇到了两个核心问题:Firebase弹出的indexOn警告,以及无法正确筛选出text字段等于Groomers的用户。咱们一步步拆解解决:
1. 先搞定indexOn警告
Firebase实时数据库执行查询时,需要对应字段的索引来保证性能,否则不仅会抛出警告,大数据量下查询还会变得卡顿。你需要在Firebase控制台的数据库规则中,给/professionals节点添加针对text字段的索引:
{ "rules": { ".read": "auth != null", // 保留你现有读写规则 ".write": "auth != null", "professionals": { ".indexOn": "text" // 新增这行索引配置 } } }
保存规则后,警告应该会很快消失。
2. 核对数据库结构是否匹配查询路径
你的查询代码是ref.orderByChild('text').equalTo("Groomers"),这要求你的数据库结构必须是如下格式:
professionals |-- 用户ID1 | |-- text: "Groomers" | |-- 其他用户字段... |-- 用户ID2 | |-- text: "其他类别" | |-- 其他用户字段...
如果text字段是嵌套在更深的层级里(比如category/text),那你需要把orderByChild的参数改成完整路径,比如ref.orderByChild('category/text').equalTo("Groomers")。
3. 调试查询结果,确认数据是否正确返回
你当前用的valueChanges()只返回数据值,建议暂时换成snapshotChanges()来查看完整节点信息,方便排查问题:
this.users = db.list('/professionals', ref => ref.orderByChild('text').equalTo("Groomers")) .snapshotChanges() .map(changes => { return changes.map(c => ({ key: c.payload.key, ...c.payload.val() })); });
然后在模板里打印出结果看看:
<pre>{{ users | async | json }}</pre>
这样你能直观看到返回的所有数据,确认是否有text等于Groomers的节点被正确筛选出来。
额外检查项
- 确认数据库规则允许当前用户读取
/professionals节点,权限不足也会导致拿不到数据 - 检查大小写:Firebase查询是大小写敏感的,确保数据库里的
text字段值和你查询的"Groomers"完全一致
内容的提问来源于stack exchange,提问作者Shyam Doshi
相关产品推荐
相关产品推荐

