如何使用OR [|| Cloud Firestore规则中的]运算符

问题描述 投票:0回答:1

我对我正在做的项目有这些规则:

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规则中的工作方式。

这就是上面所有的意思:

  1. request.resource.data.size() == 1;获取地图对象中的条目数,应为1
  2. "by" in request.resource.data;键"by"应该在数据对象中
  3. request.resource.data.by is number; "by"键的值应为数字(1或-1)
  4. request.resource.data.by == 1 || request.resource.data.by == -1;数据对象中"by"键的值应该为1或-1对吗? (我知道此值为整数而不是字符串)
  5. 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)
    });
},
google-cloud-firestore firebase-security
1个回答
2
投票

在安全规则中,request.resource.data.by不会是客户端应用程序要更改为其值的增量。这将是由于增量而将提交的实际值。

您应该做的是将request.resource.data.by(请求的值)与resource.data.by(现有的值)进行比较,以确定新值和先前值之间的变化是否可以接受。

© www.soinside.com 2019 - 2024. All rights reserved.