【发布时间】:2015-03-08 18:43:49
【问题描述】:
我正在使用 Firebase 检索用户的一些数据。
我需要用 (gameSearching = true) 检索只有一个用户。
我的数据如下:
Users
|
|_____ John
| |___ name: John Farmer
| |___ gameSearching: true
|
|_____ James
| |___ name: James Smith
| |___ gameSearching: false
|
|_____ Barbara
|___ name: Barbara Smith
|___ gameSearching: true
我正在运行这段代码:
setData(('Users/' + you + '/'), {gameSearching: true});
var ref = new Firebase("https://grootproject.firebaseio.com/Users");
var child = ref.orderByChild("gameSearching");
child.on("child_added", function (data) {
var yourself = firebase.getAuth().password.email.split("@", 1)[0];
data.forEach(
function (childSnapshot) {
if (childSnapshot[i].val().gameSearching == true && childSnapshot[i].key() != yourself) {
var opponent = childSnapshot[i].key();
setData(('Users/' + opponent + '/'), {gameSearching: false});
setData(('Users/' + yourself + '/'), {gameSearching: false});
}
}
);
});
因为 'data' 有多个值,我使用 'data.forEach' 来分隔它们。在那之后,我可以在“true”上设置“return”,这样我只会收到一个“gameSearching: true”的用户。
我的 Firebase 规则:
{
"rules": {
".read": true,
".write": true,
".indexOn": "gameSearching"
}
}
当我运行此代码时,我收到以下错误:
'未捕获的错误:没有为 gameSearching 定义索引'
我已搜索使用“.indexOn”在“gameSearching”上设置索引,但没有任何成功。 https://www.firebase.com/docs/security/guide/indexing-data.html
有人有例子或解决方案吗?
编辑:
我现在得到了以下代码:
var ref = new Firebase("https://grootproject.firebaseio.com/Users");
ref.orderByChild("gameSearching").equalTo(true).limitToFirst(1).on("child_added", function (data) {
var yourself = firebase.getAuth().password.email.split("@", 1)[0];
var opponent = data.key();
console.log(opponent);
setData(('Users/' + opponent + '/'), {gameSearching: false});
setData(('Users/' + yourself + '/'), {gameSearching: false});
console.log('ja');
});
我编辑了我的 firebase 规则:
{
"rules": {
".read": true,
".write": true,
"Users": {
".indexOn": "gameSearching"
}
}
}
indexOn 错误将不再显示,这很好。但是ref.orderByChild("gameSearching").equalTo(true).limitToFirst(1) 会运行两次。我不知道这怎么可能。我正在使用 limitToFirst(1)`,所以我希望有 1 个孩子?
【问题讨论】:
-
“没有任何成功”是什么意思?我添加了很多索引,它总是可以正常工作。你能展示你的规则的相关部分吗? (点击问题下方的编辑链接添加信息,不要将其放在评论中)
-
请注意,命令是
.indexOn,而不是您在上面键入的.indexOf。如果你在规则中犯了同样的错字,那确实是行不通的。 -
我的意思是 .indexOn,对不起。我的问题是我不知道在哪里放置 .indexOn
-
这就是为什么我要求您将规则添加到问题中。这也让你有机会修正你的错字。 :-)
-
啊,好吧,我明白为什么没有创建您的索引了。我会为那个写第二个答案,因为我在最初的答案中强调的问题也很相关。
标签: javascript json firebase