如果存在于firebase中,则更新数据

时间:2017-02-24 02:39:07

标签: firebase ionic-framework firebase-realtime-database

我正在尝试更新数据(如果存在)

var ref = firebase.database().ref().child('users');
var refUserId = firebase.database().ref().child('users').orderByChild('id').equalTo(Auth.$getAuth().uid);
refUserId.once('value', function (snapshot) {
        console.log(snapshot);
        if (snapshot.exists()) {
          snapshot.ref().update(vm.user_infos);
        } else {
        ref.push({
          player: vm.user_infos.player,
          id: vm.user_infos.id
        }, function(error) {
        console.log(error);
    })
  }
});

推送工作正常,但更新没有。

  

snapshot.ref不是函数

在snapshot()日志控制台中:

enter image description here

我也是这样试过的:

if (snapshot.exists()) {
    refUserId.update({
      player: vm.user_infos.player,
      id: vm.user_infos.id
    }, function(error) {
    console.log(error);
})

结果:

  

refUserId.update不是函数

用户结构

enter image description here

1 个答案:

答案 0 :(得分:1)

第一个问题是快照的ref property是一个对象 - 而不是一个函数。

第二个是快照引用users路径,因此您应该检查与您的查询匹配的用户,如下所示:

var ref = firebase.database().ref().child('users');
var refUserId = ref.orderByChild('id').equalTo(Auth.$getAuth().uid);
refUserId.once('value', function (snapshot) {
  if (snapshot.hasChildren()) {
    snapshot.forEach(function (child) {
      child.ref.update(vm.user_infos);
    });
  } else {
    snapshot.ref.push({
      player: vm.user_infos.player,
      id: vm.user_infos.id
    });
  }
});

如果您想知道updatepush何时完成,您可以使用承诺:

refUserId
  .once('value')
  .then(function (snapshot) {
    if (snapshot.hasChildren()) {
      return snapshot.forEach(function (child) {
        child.ref.update(vm.user_infos);
      });
    } else {
      return snapshot.ref.push({
        player: vm.user_infos.player,
        id: vm.user_infos.id
      });
    }
  })
  .then(function () {
    console.log('update/push done');
  })
  .catch(function (error) {
    console.log(error);
  });