【问题标题】:Firebase rules simulator: how to simulate pushFirebase 规则模拟器:如何模拟推送
【发布时间】:2018-04-16 11:04:58
【问题描述】:

这是我的数据库:

{
  "lists": {
    "list1_id_1": {
      "field1": "some value",
      "field2": "some value"
    }
  }
}

我想允许任何用户创建新列表,但不修改现有列表,所以我尝试了以下规则:

{
  "rules": {
    "lists": {
      ".read": "true",
      ".write": "!data.exists()"
    }
  }
}

当我尝试将以下数据写入/lists/时,这不起作用:

{ "field1": "qq", "field2": "ww" }

显然,“.write”规则导致写入失败,因为 /lists/ 已经存在。

所以我尝试了以下规则:

{
  "rules": {
    "lists": {
      ".read": "true",
      "$list_id": {
        ".write": "!data.exists()"
      }
    }
  }
}

这也不起作用,Firebase 模拟器没有选择导致写入操作失败的规则,所以我猜是因为“列表”中缺少“.write”。

你能帮帮我吗? 我认为我的问题在于规则以及我尝试将新项目推送到模拟器中的 /lists/ 的方式。

附:我知道当我尝试推送新数据时,Firebase 会生成 list_id,但我不确定如何将这些知识用于模拟器。

谢谢! 斯拉维克

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security firebase-console


    【解决方案1】:

    您的第二组规则应该可以完成这项工作,但您需要在模拟器中指定一个子 ID:

    {
      "rules": {
        "lists": {
          ".read": "true",
          "$list_id": {
            ".write": "!data.exists()"
          }
        }
      }
    }
    

    $list_id 变量指向/lists 节点下的任何子节点,因此在模拟器中,您需要将位置设置为/lists/list1_id_1 以测试写入已经存在的子节点,这应该会失败,类似:

    push 操作在给定位置创建一个具有唯一 ID 的子项。要模拟这一点,您只需将位置设置为您知道不存在的任何随机子密钥,例如:/lists/some-random-string/lists/-Kfg3YL0TS1X1SfQ9GGg

    【讨论】:

    • 但是如何在模拟器中模拟将新项目推送到 /lists/ 以确保规则正确?
    • A push 只是在给定位置创建一个具有唯一 ID 的子项。因此,在模拟器中,您只需将位置设置为您知道不存在的任何子键:/lists/some-random-string。模拟器没有内置的推送模拟,但这样做实际上是一回事。我已经用这个更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2012-05-21
    • 2018-12-31
    • 2010-11-20
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多