Firebase Database查询返回null及索引警告问题排查求助
问题排查与解决方案
我一眼就发现问题所在啦!你的查询逻辑和节点定位出了两个关键问题,咱们一步步来解决:
1. 核心问题:查询的节点定位错误
你当前的代码把查询的起点设成了单个用户节点users/hakan:
const events = ref.child('users').child('hakan');
这个节点里只有hakan的个人数据(status: "waiting"),你再在这个单个节点上执行orderByChild('status').equalTo('ok'),相当于在hakan的子节点里找status等于ok的条目——但hakan节点里的status是一个字段,不是子节点列表,自然返回null。
你应该把查询起点放在**整个用户列表节点users**上,这样才能遍历所有用户,筛选出status为ok的条目。
2. 索引警告的正确解决方式
控制台的警告提示你在/users/hakan添加索引,但这是因为你错误地在单个用户节点上执行查询导致的。正确的做法是在users节点添加针对status字段的索引,这样Firebase服务器就能高效处理你的查询,不用在客户端过滤数据。
修正后的代码
var firebase = require('firebase'); var config = { apiKey: "<my-api-key>", authDomain: "<firebasename>.firebaseio.com", databaseURL: "https://<firebasename>.firebaseio.com", }; firebase.initializeApp(config); ref = firebase.database().ref(); // 把查询起点改成整个users列表 const usersRef = ref.child('users'); // 在users列表上筛选status为ok的前2个用户 const query = usersRef.orderByChild('status').equalTo('ok').limitToFirst(2); query.on("value", sorunsuz, sorunlu); function sorunlu(error) { console.log("Something went wrong."); console.log(error); } function sorunsuz(data) { var users = data.val(); console.log(users); // 如果你想遍历结果,可以这样做: // Object.values(users).forEach(user => { // console.log(user.sayilar, user.status); // }); }
修正后的数据库规则
{ "rules": { "users": { ".read": true, ".write": true, // 添加针对status字段的索引 ".indexOn": "status" } } }
现在运行node index.js,应该就能得到edRIPg8BcZU9YPbubp7HtQo7phl1和mehmet这两个符合条件的用户数据了!
内容的提问来源于stack exchange,提问作者Faruk
相关产品推荐
相关产品推荐

