增量操作的Firebase规则无法正常工作

时间:2017-07-28 05:26:14

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

我有一个非常简单的Firebase数据库,只有一个条目" async-testing / companies:0"。 enter image description here

我有以下firebase规则,如果未定义则将"companies"设置为0,否则允许写入如果它比"companies"的当前值大1:

{
  "rules": {
      ".read": "auth != null",
      ".write": "auth != null",
      "async-testing": {
        "companies": {  
              ".validate": "(data.exists() && (newData.val() === data.val() + 1)) || (!data.exists() && newData.val() == 0)" 
        }
      }
  }
}

然而,当我试图设置"公司"在Firebase模拟器中等于1,它不起作用:

enter image description here

更奇怪的是,当我将Firebase规则设置为仅在未定义"companies"时接受写入时,它才能正常工作:

{
  "rules": {
      ".read": "auth != null",
      ".write": "auth != null",
      "async-testing": {
        "companies": {  
              ".validate": "!data.exists()" 
        }
      }
  }
}

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:2)

在模拟器图像中,显示位置字段 https://async-testing.firebaseio.com/。这表示您的项目名称为async-testing。 (我不知道你是如何得到这么简单的项目名称的。我的所有内容都包含一些自动生成的数字或其他文字。)

在数据库的图像中,列出async-testing代表数据库的根目录。这不是一条路。我相信你错误地将async-testing的外观误认为它是一个路径组件,必须包含在规则中。

因为@JoeWu在他的回答中指出(我对其进行了投票),您的规则不应包含async-testing作为companies的父位置。或者,如果您希望保留规则,则需要重新创建数据库以创建根子async-testing,并创建companies作为其子项。

答案 1 :(得分:1)

不需要'async-testing'图层。尝试:

{
  "rules": {
      ".read": "auth != null",
      ".write": "auth != null",
        "companies": {  
              ".validate": "(data.exists() && (newData.val() === data.val() + 1)) || (!data.exists() && newData.val() == 0)" 
        }
  }
}

enter image description here

答案 2 :(得分:0)

我尝试过它。

检查:

  • 检查您的公司是否真的设置为0。
  • 尝试使用没有模拟器的真实请求(以防万一)。