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

增量操作的Firebase规则不起作用,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我有一个非常简单的Firebase数据库,只有一个条目“async testing/Companys:0”。 我有以下firebase规则,如果未定义,则将“companys”设置为0,如果大于“companys”的当前值1,则允许写入: { "rules": { ".read": "auth != null", ".write": "auth != null", "async-testing": { "companies": {

我有一个非常简单的Firebase数据库,只有一个条目“async testing/Companys:0”。

我有以下firebase规则,如果未定义,则将
“companys”
设置为0,如果大于
“companys”
的当前值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时,它不起作用:

更奇怪的是,当我将Firebase规则设置为仅在
“companys”
未定义时才接受写操作时,它工作正常:

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

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

不需要“异步测试”层。尝试:

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

不需要“异步测试”层。尝试:

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

我试过了,效果很好

检查:

  • 检查您的公司是否真的设置为0
  • 在没有模拟器的情况下用一个真实的请求来尝试它(以防万一)
我试过了,效果很好

检查:

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

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

在数据库的映像中,列出了异步测试,以表示数据库的根。这不是一条路。我相信您错误地认为
异步测试的出现意味着它是一个路径组件,必须包含在规则中


因此,正如@JoeWu在他的回答(我投了赞成票)中指出的那样,您的规则不应该将
异步测试
作为
公司
的父位置。或者,如果您想保持规则不变,则需要重新创建数据库,以创建根子级
异步测试
,并将
公司
创建为子级。

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

在数据库的映像中,列出了异步测试
,以表示数据库的根。这不是一条路。我相信您错误地认为
异步测试的出现意味着它是一个路径组件,必须包含在规则中


因此,正如@JoeWu在他的回答(我投了赞成票)中指出的那样,您的规则不应该将
异步测试
作为
公司
的父位置。或者,如果您想保持规则不变,则需要重新创建数据库,以创建根子级
异步测试
,并作为子级创建
公司

能否向我们展示错误详细信息我刚刚尝试过,效果很好..嗯,非常奇怪。我又试了一次,但还是不起作用。我还尝试使用一个真实的请求向db写入数据,我尝试过的每个查询(包括{“companys”:3})在您的数据库中没有输入错误?关于公司或异步测试?你能告诉我们错误详细信息吗?我刚试过,效果很好..嗯,很奇怪。我又试了一次,但还是不起作用。我还尝试使用一个真实的请求向db写入数据,我尝试过的每个查询(包括{“companys”:3})在您的数据库中没有输入错误?在公司或异步测试中?您的解决方案奏效了,我认为问题在于我将根路径设置为与数据库相同的名称。谢谢您的解决方案奏效了,我认为问题在于我将根路径设置为与数据库相同的名称。谢谢