2016-02-05 35 views
0

我有一个组件,用于检查用户之前是否已投递了帖子。如果他们有,那么他们不能再次赞扬那个帖子。如果他们没有,那么他们被允许。Firebase .push()试图添加到数据库,但失败?

该代码适用于要添加的第一个用户。 Firebase会创建一个唯一的密钥,然后添加upVotedBy: userKey。但是,如果我尝试以另一个用户身份登录并执行相同操作,它将不会为新用户添加记录。它也没有记录任何类型的错误。

如果我在查看Firebase的同时进行投票,它会尝试使用唯一键添加新记录,然后变红并将其收回。有任何想法吗?

编辑:我缩小了它,似乎如果已经有记录,任何记录,它不会添加它。它将添加第一个,但不会添加任何后续记录。

我的数据结构是这样的:

Data Structure

以下是部分:

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

你能展示数据在firebase中的外观吗?我无法真正知道你是如何从单独的代码构建数据的。 –

+0

@AndréKool当然可以。添加 –

+0

因此,用户只需循环遍历所有项目,并检查他是否已上传该项目?而你的问题是,当用户a已经upvoted该项目用户b不能upvote它?对不起,如果我问很多,我还没有足够的咖啡:P –

回答

2

得到了一些咖啡和答案:)更多explenation或问题,只是发表评论。

问题在于你保存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)) 
    } 

以及保存,你必须使用设置(在给予好评),而不是推()

ref.child('items').child(this.props.keyNum).child('upVotedBy').child(userKey).set(true); 
+0

存储投票作为关键字的用户看起来确实是正确的方法。尽管我可能只会存储具有“真实”的用户。什么是你调用btw的'setState()'方法? –

+0

我从问题中复制了setState()。我希望我做对了。 –

+0

啊,我错过了。 :-) –

相关问题