Firebase数据库规则:仅当newData具有具有用户id的子id时应用更新
我正在用这个模式更新列表元素Firebase数据库规则:仅当newData具有具有用户id的子id时应用更新,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在用这个模式更新列表元素{id:{id:id},并将id子元素与auth.uid进行比较,后者是相同的。由于某种原因,该行返回的权限被拒绝 新数据实际上包装了所有正在侦听的对象,而不仅仅是已更改的“新数据”。所以我需要看得更深一层: ".write": "auth!=null && ( ( newData.val() != data.val() && newData.child
{id:{id:id}
,并将id子元素与auth.uid
进行比较,后者是相同的。由于某种原因,该行返回的权限被拒绝
新数据实际上包装了所有正在侦听的对象,而不仅仅是已更改的“新数据”。所以我需要看得更深一层:
".write": "auth!=null && (
(
newData.val() != data.val() &&
newData.child('id').val() === auth.uid
)
|| !data.exists()
)"
我认为这张图片让我对问题有了更好的理解,但你看……我看不出你所写的规则有任何错误,我唯一能想到的是,可能是你在哪里有这些规则的问题。请您再添加一点数据库规则,好吗?请确保您的问题中包含当前您尝试更新的位置的JSON。另外(正如杰里米已经问过的):确保规则是最小的但有效的。现在,我们不知道您将共享的代码片段放在规则文件的何处,这很可能是问题的原因。你们都是对的。为了易读,我没有显示整个规则集,但这是必要的。问题是,我认为newData只引用了不断变化的对象,但它似乎包含了规则正在侦听的所有路径。所以我最终通过添加newData.child('users').child(auth.uid).exists()解决了这个问题
"chats": {
"$chat": {
".write": "auth!=null && ((newData.val() != data.val() && newData.child('users').child(auth.uid).exists()) || !data.exists())"
}
}