如何设置Firebase规则,实现仅当子节点不存在时才允许写入?
现有规则失效原因
- 路径不匹配:你把规则配置在
/NEWS根节点,但实际写入的是/NEWS/[语言]/[电影名称]的深层子节点,规则判断逻辑没有适配实际操作的路径层级 - 判断逻辑错误:在
/NEWS节点的write规则中,data本身就指向/NEWS节点的已有数据,你额外调用parent().child('NEWS')属于重复操作,更关键的是只要/NEWS下曾经存在过任意内容,这个判断条件就永远为假,自然无法写入
适配需求的正确规则配置
{ "rules": { "NEWS":{ ".read": "auth.uid!==null", "$language": { "$filmName": { // 仅当当前电影对应的资讯节点不存在、且用户已登录时允许写入 ".write": "auth.uid!==null && !data.exists()" } } } } }
- 通配符
$language和$filmName可以匹配你代码中动态的语言、电影名称路径层级 - 这里的
data指向你实际操作的/NEWS/[语言]/[电影名称]节点的已有数据,!data.exists()正好对应你代码中snapshot.getChildrenCount() == 0的判断逻辑,完全匹配你“节点不存在时才允许恢复写入”的需求 - 如果你后续需要允许用户在节点存在后也能追加新的资讯内容,直接把write规则简化为
auth.uid!==null即可
内容的提问来源于stack exchange,提问作者alexandr gladevt
相关产品推荐
相关产品推荐

