如何防止双重投票反应-Firebase

时间:2018-09-06 23:20:43

标签: javascript reactjs firebase firebase-realtime-database firebase-security-rules

我正在尝试阻止Firebase中的双重投票。我的想法是在firebase中创建一个表决对象,然后在有人投票时添加一个user_id布尔值。所以counterTips>votes>User_id1: true> UserId2: True.

这些是我的安全规则:

{

  "rules": {
    ".read": true,
    ".write": true,
      "CounterTips": {
     "votes": {
                "$uid": {
                    ".write": "auth.uid != null && auth.uid === $uid"
                }
              }
            }
  }


}

这是我的数据库的结构方式

CounterTips 

 user_id: "rI9m9GEkyKhopAhaDNC8GNWPS943"

 vote: 5, 

 votes: 
1) bbz9MLo1u7T7zxugmHA806nMof93: true

我正在尝试将当前用户ID推入投票对象,但只是获取了一个表示user_id:true的静态字符串。如何在安全规则中将实际的user_id投票,并阻止该用户再次投票?

     upvotePost(key, vote, user_id) {

if (this.state.user_id !=null )
{

CounterTipsref.child("votes/${this.state.user_id}").once("value",snapshot => {
    if (snapshot.exists()){
      const userData = snapshot.val();
      console.log("exists!", userData);
    }


});
}

 else{
alert(this.state.user_id);
let user_id= this.state.user_id;
let votes = { [user_id]: true};

vote++;
CounterTipsRef.child(key).update({ 'vote': vote, 'votes': votes }); 
}
}
if (this.state.user_id==null) {

this.props.history.push('/login');
}


  }
}

1 个答案:

答案 0 :(得分:1)

您的问题是您使用的是这种符号:

let votes = { user_id: true};

此处的user_id被视为属性的名称,而不是变量 holding 的属性名称。快速解决方案是使用[]表示法:

let votes = { };
votes[user_id] = true;