我有一个组件可以检查用户之前是否对帖子进行过投票。如果他们有,那么他们不能再次投票。如果他们没有,那么他们被允许。
该代码非常适合要添加的第一个用户。 Firebase会创建一个唯一键,然后添加upVotedBy: userKey
。但是,如果我尝试以另一个用户身份登录并执行相同操作,则不会为新用户添加记录。它也没有记录任何类型的错误。
如果我在向上看Firebase时它会尝试使用唯一键添加新记录,然后变为红色并将其缩回。有任何想法吗?
编辑:我把它缩小了,似乎如果已经有记录,任何记录,它都不会添加它。它将添加第一个,但不会添加任何后续记录。我的数据结构如下:
以下是组件:
handleUpVote: function(item){
var ref = new Firebase(rootUrl);
var authData = ref.getAuth();
if(authData){
var userKey = authData.uid;
console.log('this is userKey ' + userKey)
var stateCopy = Object.assign({}, item);
ref.child('items').child(this.props.keyNum).child('upVotedBy').once('value', function(snapshot){
snapshot.forEach(function(childSnapshot){
console.log('this is snapshot.key ' + childSnapshot.val().upVotedBy);
if(childSnapshot.val().upVotedBy === userKey){
this.setState({userUpvoted: true})
console.log('u already liked this')
}
}.bind(this))
}.bind(this)).then(function(){
if(this.state.userUpvoted === false){
console.log('okay u can like this')
stateCopy.upVotes += 1;
ref.child('items').child(this.props.keyNum).child('upVotedBy').push({
upVotedBy: userKey
}, function(error){
if(error){
console.log('push error: ' + error)
}
})
console.log(stateCopy.upVotedBy)
this.fb.update(stateCopy);
}
}.bind(this))
} else {
console.log('must be logged in to upvote')
}
},
答案 0 :(得分:2)
得到一些咖啡和答案:)更多的言论或问题只是评论。
问题在于你保存upvote的方式。我建议这样做:
-Items
-itemid1
-upvotedBy
-userA: true
-userB: true
-itemid2
-upvotedBy
-userA: false
-userB: true
在你检查中你必须做这样的事情:
ref.child('items').child(this.props.keyNum).child('upVotedBy').once('value', function(snapshot){
snapshot.forEach(function(childSnapshot){
if(childSnapshot.key() === userKey){
//see if it is upvoted using childSnapshot.val()
}
}.bind(this))
}
为了保存upvote,你必须使用set()而不是push()
ref.child('items').child(this.props.keyNum).child('upVotedBy').child(userKey).set(true);