首页 > 解决方案 > Firebase 数据库规则:.exists() 始终为真

问题描述

我试图让人们在游戏中推荐朋友。添加多个朋友有好处,我试图避免利用添加的随机用户名。所以我想在他们将用户添加到他们的列表之前检查用户是否实际存在并且用户使用他们的推荐代码注册。

这是我的数据库结构的示例:

"friends": {
    "qwerty12345": {
        "friend1": {},
        "friend2": {},
        "friend3": {},
        "friend4": {},
    }
},
"users": {
    "qwerty12345": {},
    "salamander12345": {},
    "harrypotter12345": {}
}

所以,有了上面的结构;

当有人注册时,会设置一个朋友推荐人。这是推荐他们的朋友的“帐户 uid”。我想要做的是将当前用户uid添加为朋友>推荐朋友的孩子。

所以,假设用户pikachu12345从他们的朋友发送的链接注册qwerty12345。结构将如下所示:

"friends": {
    "qwerty12345": {
        "pikachu12345": {},
    }
},

如果它friends > qwerty12345 > pikachu12345 存在qwerty12345users.

我设置了这个规则:

"friends": {
    "$user": {
      ".write": "$user === newData.child('account_uid').val() && root.child('users').child(newData.child('account_uid').val()).exists()"
    }
  },

编辑: newData.child('account_uid').val() = 指的是正在传递的数据对象(下面),这评估为qwerty12345

但是,当我设置用户表hercule12345存在的推荐朋友时。它仍然将其添加到朋友树中。

为什么它总是评估真实?

编辑,如果它是相关的,这是使用云函数编写的:

var data = {
        account_uid: "qwerty12345",
        current_user:"pikachu12345"
    }
admin.database().ref(`/friends/${data.account_uid}/${data.current_user}`).set(data)

标签: javascriptfirebasewebfirebase-realtime-databasefirebase-security

解决方案


推荐阅读