【发布时间】:2021-01-10 00:32:01
【问题描述】:
在我的 Firestore 数据中,我有以下内容
- 物品ID
- amountOfItemsToPurchase: 1
- itemsLeft: 3
如果用户想要为相同的 ItemID 更新要购买的项目或在 ItemID 不存在的情况下创建文档,我使用set(, {merge:true},但是在Firestore 安全规则的条款变得复杂了。
我写了以下测试:
const initialUserDoc = adminFirestore.collection("Users").doc(VALID_USER_ID).collection("Cart").doc(documentID);
await initialUserDoc.set({
"amountOfItemsToPurchase": 1,
"itemsLeft": 3
});
// Get the user's node and grab the example user
const userTestRef = db.collection("Users").doc(VALID_USER_ID).collection("Cart").doc(documentID);
await firebase.assertFails(userTestRef.set({
"amountOfItemsToPurchase": firebase.firestore.FieldValue.increment(1000),
}, {merge: true}));
此测试结果如下:Error: Expected request to fail, but it succeeded
我想要的每个场景(更新或创建),以避免amountOfItemsToPurchase 超过itemsLeft,为此我使用以下内容:
request.resource.data.amountOfItemsToPurchase <= request.resource.data.itemsLeft => 这将在 allow create 部分中。
这会引起以下情况:
allow create 或 allow update** 会被调用吗?还有为什么不考虑itemsLeft 变量
【问题讨论】:
-
请编辑问题以显示未按预期方式运行的完整规则以及执行更新的客户端代码。只要您调用该操作,我不明白为什么您的条件不适用于更新,就像它对创建一样。无论哪种情况,您都拒绝了文档中不满足您的条件的新内容。
-
@DougStevenson 我更新了我的问题
-
你的完整规则在哪里?请确保您尝试执行的操作实际上不仅适用于更新,也适用于创建。我建议他们应该工作正常。带有合并的更新要么是在首次创建文档时创建,要么是在文档已经存在时进行的更新。这种行为没有任何含糊之处。
标签: node.js google-cloud-firestore firebase-security