Firebase .push()尝试添加到数据库但失败了?

时间:2016-02-05 12:30:43

标签: javascript reactjs firebase

我有一个组件可以检查用户之前是否对帖子进行过投票。如果他们有,那么他们不能再次投票。如果他们没有,那么他们被允许。

该代码非常适合要添加的第一个用户。 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')
    }


},

1 个答案:

答案 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);