Firebase 规则通配符和子级比较

Posted

技术标签:

【中文标题】Firebase 规则通配符和子级比较【英文标题】:Firebase Rules Wildcard and Child comparison 【发布时间】:2019-01-27 07:53:51 【问题描述】:

我正在尝试将 Firebase 的规则通配符与子比较混合。

我在其他地方读到一个值为“4”的孩子。

当我进行字面比较时,模拟器给了我绿灯(像这样):


  "rules": 
    "die": 
      "rolls": 
        "$i": 
          ".read": "4 == root.child('die/i').val()"
        
      ,
      "i": 
        ".read": true,
        ".write": true
      
    
  

输出(成功):

Type    read
Location    /die/rolls/4
Data    null
Auth    null
Read successful
Line 7 (/die/rolls/4)
read: "4 == root.child('die/i').val()"

但是通配符比较失败。为什么?


  "rules": 
    "die": 
      "rolls": 
        "$i": 
          ".read": "$i == root.child('die/i').val()"
        
      ,
      "i": 
        ".read": true,
        ".write": true
      
    
  

输出(失败):

Type    read
Location    /die/rolls/4
Data    null
Auth    null
Read denied
Line 7 (/die/rolls/4)
read: "$i == root.child('die/i').val()"

(另外,我尝试过模拟身份验证;同样的事情。)

【问题讨论】:

将其转换为文本并给出了我能给出的错误/日志。谢谢 感谢! (我无法回答你的实际问题,但祝你好运) Alex,如果@Padawan 的回答没问题,你真的应该选择它。 【参考方案1】:

失败的原因是因为

root.child('die/i').val()

返回一个数字。根据 Firebase 文档

注意:路径键始终是字符串。出于这个原因,重要的是要记住,当我们尝试将 $ 变量与数字进行比较时,这总是会失败。这可以通过将数字转换为字符串来纠正(例如 $key === newData.val()+'')

以下内容为您提供您想要的结果

 
 "rules": 
   "die": 
     "rolls": 
       "$i": 
         ".read": "$i === root.child('die/i').val()+''"
       
     ,
     "i": 
       ".read": true,
       ".write": true
     
   
 

Firebase documentation

【讨论】:

以上是关于Firebase 规则通配符和子级比较的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 中使用通配符?

对于 Firebase 动态链接,如果您使用 IOS 通配符,您应该为团队 ID 输入啥?

如何从 Firebase 云函数中的通配符获取数据

如果已知通配符,Firebase会使用通配符来读取数据

比较选择器特殊性

层叠机制--比较特殊性