代码之家  ›  专栏  ›  技术社区  ›  lampShadesDrifter

你怎么知道的资源.数据.大小()在firestore规则中工作(正在计算什么)?

  •  3
  • lampShadesDrifter  · 技术社区  · 6 年前

    太长,读不下去了 request.resource.data.size() 在firestore规则中计数,比如说,在文档中写入一些布尔值和嵌套对象?不知道这些文件是什么意思 条目 “在地图上”( https://firebase.google.com/docs/reference/rules/rules.firestore.Resource#data https://firebase.google.com/docs/reference/rules/rules.Map )在规则模拟器中进行测试时,我的假设似乎是错误的(类似于 request.resource.data.keys().size() ).


    请求资源数据.size() 等于某个数。

    传递到firestore的数据示例 update

     Object {
       "parentObj": Object {
         "nestedObj": Object {
           "key1": Timestamp {
             "nanoseconds": 998000000,
             "seconds": 1536498767,
           },
         },
       },
       "otherKey": true,
     }
    

    其中时间戳是通过 firebase.firestore.Timestamp.now() 在规则模拟器中,这似乎可以很好地工作,但在执行此操作时,它并不适用于实际数据

    let obj = {}
    obj.otherKey = true
    // since want to set object key name dynamically as nestedObj value,
    // see https://stackoverflow.com/a/47296152/8236733
    obj.parentObj = {} // needed for adding nested dynamic keys
    obj.parentObj[nestedObj] = {
        key1: fb.firestore.Timestamp.now()
    }
    
    firebase.firestore.collection('mycollection')
    .doc('mydoc')
    .update(obj)
    

    request.resource.data.size() == 2 这似乎是导致权限被拒绝错误的规则(因为注释掉这些规则会使事情再次正常工作)。会认为既然对象是用2个(顶级)键传递的,那么 =2,但情况显然不是这样(传递的对象中的键总数也不是这样)(与 请求资源数据.keys().size()

    1 回复  |  直到 6 年前
        1
  •  10
  •   Zeeshan Adil    6 年前

    从一个月前我与firebase支持部门的最后一次通信中,我发现 request.resource.data.size() 以及基于时间戳的查询安全规则。

    我也被告知 成功写入后文档的大小。因此,如果要向包含4个键的文档中写入2个附加键,则应该检查的值是6,而不是2。

    请求资源数据.size() request.resource.size() 在本文档中似乎使用了 https://firebase.google.com/docs/firestore/solutions/role-based-access

        2
  •  0
  •   l1b3rty    5 年前

    几个小时来我一直在努力解决这个问题,现在我看到Firebase上的医生说得很清楚:“问题是请求资源变量包含文档的未来状态”。所有的字段,不仅仅是发送的字段。 https://firebase.google.com/docs/firestore/security/rules-conditions#data_validation

    但实际上还有另一种方法可以只计算发送的字段数request.writeFields.size文件(). writeFields属性是一个包含所有传入字段的表。

    编辑:writeFields显然不再在模拟器中工作了。。。

    推荐文章