Firestore无法与函数内的 get 配合使用
我有这个规则
service cloud.firestore {
match /databases/{database}/documents {
function isProjectOpenForAssign() {
return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;
}
match /projects/{anyProject} {
allow create: if request.auth != null;
match /tasks/{anyTask} {
allow create: if request.auth != null && (isProjectOpenForAssign());
}
}
}
}
在运行模拟器测试时,我得到:
运行模拟时出错-错误:simulator.rules第[23]行,第[14]列。找不到函数错误:名称:[get]。错误:提供了无效的参数来调用。函数:[get],参数:[“ || invalid_argument ||”]
答案 0 :(得分:1)
问题出在定义函数的范围之内。由于您在与此匹配项isProjectOpenForAssign
相同的级别上定义了match /projects/{anyProject}
,因此该函数将无权访问anyProject
。
有两种解决方案:
将anyProject
作为参数传递给isProjectOpenForAssign
。
function isProjectOpenForAssign(anyProject) {
return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;
}
match /projects/{anyProject} {
allow create: if request.auth != null;
match /tasks/{anyTask} {
allow create: if request.auth != null && (isProjectOpenForAssign(anyProject));
}
}
在声明anyProject
的匹配项内定义函数。
match /projects/{anyProject} {
function isProjectOpenForAssign() {
return get(/databases/$(database)/documents/projects/$(anyProject)).data.canAssignTask == true;
}
allow create: if request.auth != null;
match /tasks/{anyTask} {
allow create: if request.auth != null && (isProjectOpenForAssign());
}
}