我正在尝试将Firebase的Rule通配符与子级比较混合在一起。
我正在其他地方读书,孩子的价值是“ 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()"
(另外,我也尝试过模拟身份验证;同样的事情。)
答案 0 :(得分:2)
失败的原因是因为
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