Firebase规则模拟器:如何模拟推送

时间:2017-11-03 16:32:11

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

这是我的数据库:

{
  "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 /的方式。

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

谢谢! 斯拉维克

1 个答案:

答案 0 :(得分:1)

您的第二组规则应该可以胜任,但您需要在模拟器中指定子ID:

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

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

simulator screenshot

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