增量操作的 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
作为它的子项。
我有一个非常简单的 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
作为它的子项。