我正在尝试创建以下结构:
[
{
name: 'tester',
comment: 'first comment',
comments: [
{
name: 'tester2',
comment: 'reply'
}
]
}
]
我已设置以下安全规则:
{
"rules": {
".read": true,
"comments": {
"$recording": {
"$comment": {
".write": "!data.exists() && auth != null",
".validate": "auth.name == newData.child('name').val() && newData.hasChildren(['name', 'comment']) && newData.child('comment').isString()",
"comments": {
"$reply": {
".write": "!data.exists() && auth != null",
".validate": "auth.name == newData.child('name').val() && newData.hasChildren(['name', 'comment']) && newData.child('comment').isString()"
}
}
}
}
}
}
}
但是当我尝试push()
到现有评论的comments
属性时,第一个!data.exists()
中的.write
会失败。即使不这样做,第一个auth.name == newData.child('name').val()
中的.validate
也会失败。
所以我的问题是:如何在防止更改其他属性的同时有选择地允许推送属性?换句话说,我是否可以注意到我是在尝试写入.write
或.validate
/ comments / 1/2中的/ comments / 1/2/3?
答案 0 :(得分:1)
写规则有" OR"关系。您只需要一个成功允许写入。验证规则有一个" AND"关系 - 他们都需要成功地允许写作。
我不确定为什么上面的例子不起作用。你应该可以推送到/ comments / $ recording / $ comment / comments /
我建议您通过Firebase控制台中的规则模拟器运行此操作,以了解您的写入失败的原因。