对于我正在做的项目,我有以下规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /cards/{cardID} {
allow update: if request.resource.data.size() == 1 &&
"by" in request.resource.data &&
request.resource.data.by is number &&
request.resource.data.by == 1 || request.resource.data.by == -1 &&
request.resource.data.by != resource.data.by;
}
}
}
我在调试时遇到了麻烦,或者应该说是了解||
运算符在Cloud Firestore规则中的工作原理。
这就是上述所有含义:
request.resource.data.size() == 1
;获取地图对象中的条目数,应为1 "by" in request.resource.data
;键"by"
应该在数据对象中request.resource.data.by is number
; "by"
键的值应为数字(1或-1)request.resource.data.by == 1 || request.resource.data.by == -1
;数据对象中的"by"
键的值应该为1或-1对吗? (我知道此值为整数而不是字符串)request.resource.data.by != resource.data.by
; "by"
键的值不应等于文档中已有的值虽然发生的是,上面列表中的4点没有得到预期的评估,所以我猜测这行代码在做错事,因为当我将其删除时,一切正常。
我在客户端遇到的错误:
"FirebaseError: [code=permission-denied]: Missing or insufficient permissions."
用于更新数据库中的"by"
字段的调用:
async updateCount() {
let count = // it can be 1 or -1
const res = await firebase
.firestore()
.doc("cards/UzSgU6Y5sDvERqnG3gK7")
.update({
by: firebase.firestore.FieldValue.increment(count)
});
},
答案 0 :(得分:1)
在安全规则中,1 | 2
不会是客户端应用程序要更改为其值的增量。这将是由于增量而将提交的实际值。
您应该做的是将request.resource.data.by
(请求的值)与request.resource.data.by
(现有的值)进行比较,以确定新值和先前值之间的变化是否可以接受。