增量操作的 Firebase 规则不起作用

Firebase rules for increment operation not working

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

我有以下 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 模拟器中将 "companies" 设置为 1 时,它不起作用:

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

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

如有任何帮助,我们将不胜感激。谢谢。

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

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

我试过了,效果很好。

检查:

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

在模拟器图像中,位置字段显示 https://async-testing.firebaseio.com/。这表明您的项目名称是 async-testing。 (我不知道你怎么起这么简单的项目名称,我的都是一些自动生成的数字或其他文本。)

在您的数据库映像中,列出了 async-testing 以表示您的数据库的根目录。这不是一条路。我相信你误会了 async-testing 的出现意味着它是一个路径组件,必须包含在规则中。

正如@JoeWu 在他的回答(我赞成)中指出的那样,您的规则不应包括 async-testing 作为 companies 的父位置。或者,如果您想保持规则不变,则需要重新创建数据库以创建根子项 async-testing,并创建 companies 作为它的子项。