问题:当我尝试在a
集合中创建对象时,Firestore规则模拟器在顶部显示红色的失败横幅。
这是横幅:
模拟器输入:
create
/z/zid0/a/aid0
check
google
aid0
yes
以下是缩写的规则来源:
service cloud.firestore {
match /databases/{database}/documents {
match /z/{zId} {
function isWriteAllowedCurrentZ() {
return getUserDataForCurrentZ().keys().hasAll(['write'])
}
function getUserDataForCurrentZ() {
return get(/databases/$(database)/documents/z/$(zId)/a/$(request.auth.uid)).data;
}
function zExists() {
return exists(/databases/$(database)/documents/z/$(zId))
}
function isCreateA_Allowed() {
return !zExists() || isWriteAllowedCurrentZ()
}
match /a/{document=**} {
allow create: if isCreateA_Allowed();
}
}
}
期望
因为zid0不存在,所以我期望/z/zid0/a/aid0
的创建会成功,因为isCreateA_Allowed()
-> !zExists()
将返回true。
结果 出现红色横幅上方。
当前流量
我怀疑Firestore规则评估程序没有使布尔逻辑短路。即使IsWriteAllowedCurrentZ()
是真实的并且与它进行“或”运算,它最终仍会调用!zExists()
。 IsWriteAllowedCurrentZ()
将尝试访问不存在的对象并失败(不返回false,但失败),这会以错误的形式冒出模拟器。我已经能够模拟有效的拒绝,并且与成功类似,在做出决定的规则旁边会出现一个红色的“ x”标记。与上面看到的红色横幅相比,这是完全不同的视觉效果。
尝试过的事情
尝试使isCreateA_Allowed
仅检查!zExists()。可行(我得到一个绿色的复选标记)
function isCreateA_Allowed() {
return !zExists() // || isWriteAllowedCurrentZ()
}
尝试将isWriteAllowedCurrentZ更改为始终返回false。可行(我得到一个绿色的复选标记)
function isWriteAllowedCurrentZ() {
return false // getUserPermsDataForCurrentZ().keys().hasAll(['write'])
}
试图在调用getUserDataForCurrentZ()之前进行是否存在检查,但这不起作用。它会生成相同的红色横幅。
function isWriteAllowedCurrentZ() {
return doesUserDataExist() && getUserDataForCurrentZ().keys().hasAll(['write'])
}
任何帮助,将不胜感激。
谢谢!