You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase数据库使用!newData.exists()始终触发权限拒绝问题求助

解决Firebase Realtime Database帖子写入权限被拒问题

问题根源

你当前的规则直接作用在posts根节点上,.write: !newData.exists()的逻辑是只有当posts节点本身完全不存在时才能写入。但你用push()是往posts下添加新的子节点(比如posts/-Nabc123...),此时posts节点的新状态(newData)是存在的(包含了你要添加的子节点),所以!newData.exists()会返回false,触发权限拒绝。

正确的规则配置

要实现“允许创建新帖子(即子节点不存在时可写入)”,需要把规则作用到posts的子节点层级,用通配符$postId匹配每个帖子节点:

"posts": {
  ".read": "auth !== null",
  "$postId": {
    ".write": "!data.exists()"
  }
}

规则解释

  • $postId是通配符,匹配posts下的任意子节点(也就是每个独立帖子)
  • !data.exists()表示:当这个帖子节点(posts/$postId)本身不存在时,允许写入。这正好符合你创建新帖子的需求,同时能防止覆盖已存在的帖子。

进阶规则优化(可选)

如果需要限制只有登录用户才能创建帖子,或者验证帖子字段合法性,可以扩展规则:

"posts": {
  ".read": "auth !== null",
  "$postId": {
    ".write": "!data.exists() && auth !== null && newData.child('creator').val() === auth.uid",
    ".validate": "newData.hasChildren(['content', 'creator', 'timestamp'])"
  }
}

这个规则同时实现:禁止覆盖已有帖子、要求用户登录、验证帖子必须包含指定字段,且创建者ID与当前用户UID一致。

内容的提问来源于stack exchange,提问作者Cartoon guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:22:50