作者:终结者 | 来源:互联网 | 2023-05-27 14:16
我正在使用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'接收一个用户.
我的火力基地规则:
{
"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> Frank van Pu..:
现在你已经添加了规则,很清楚那里有什么问题.
这些是您目前的规则:
{
"rules": {
".read": true,
".write": true,
".indexOn": "gameSearching"
}
}
因此,您允许每个人在整个Firebase上进行读写访问,并告诉它添加索引gameSearching
.问题是您已将索引定义在顶级,而不是在Firebase中需要的级别.
这是您当前的数据结构:
{
"Score" : {
"sam_lous" : {
"score" : 2
}
},
"Users" : {
"hallo" : {
"gameSearching" : true
},
"sam_lous" : {
"gameSearching" : true
},
"test" : {
"gameSearching" : false
},
"test2" : {
"gameSearching" : true
}
}
}
该gameSearching
属性仅存在于Users
节点的子节点下.这就是你应该定义你的地方.indexOn
:
{
"rules": {
".read": true,
".write": true,
"Users": {
".indexOn": "gameSearching"
}
}
}
这样,您的索引应该被创建(根据我的经验,它会在您保存规则时立即发生)并且错误/警告消息应该消失.但是为了解决这个问题,你还应该对我在其他答案中所做的更改进行修改.
我必须承认Firebase的索引数据的文档可能会更明确地定义这些.indexOn
规则.如果Firebase的某人正在阅读,您能否添加一些更好的示例,突出显示.indexOn
需要在数据所在级别定义?