javascript - Firebase 未定义索引

标签 javascript json firebase

我正在使用 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"
  }
}

当我运行这段代码时,出现以下错误:

'Uncaught Error: No index defined for 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 个 child ?

最佳答案

现在您添加了您的规则,很清楚哪里出了问题。

这些是您当前的规则:

{
  "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's documentation on indexing your data , 可以更清楚地定义这些 .indexOn 规则的位置。如果 Firebase 的某个人正在阅读,您能否添加一些更好的示例来强调 .indexOn 需要在数据所在的级别定义?

关于javascript - Firebase 未定义索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877612/

相关文章:

javascript - 使用 mongoose 中现有集合的一部分

javascript - 如何将 Angular 中的日期作为时间戳保存到 Firestore?

使用多个项目时 Firebase 部署到错误的托管

javascript - Angular JS : sending data from select field via POST with $httpParamSerializerJQLike

javascript - 获取父级信息并将其传递到隐藏表单

java - jackson : How to serialize into an unnamed array

javascript - 将 JSON 对象推送到 localStorage 中的数组

Firebase Firestore 构建时出现错误 : Call to constructor of 'firebase::firestore::util::FormatArg' is ambiguous

javascript - 如何使用 JQuery 验证正则表达式不需要的字段

php - 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 中断