【问题标题】:Firebase using JS - Struggling to update value if exists or add if it doesntFirebase 使用 JS - 如果存在则努力更新值,如果不存在则添加
【发布时间】:2017-08-08 13:37:39
【问题描述】:

有点困惑为什么这不起作用。

      const person = {};
      person[this.name] = 0;

      const personQuery = `person/${this.name}`;
      firebase.child(personQuery).on('value', (snapshot) => {
        if (snapshot.exists()) {
          // Update
          console.log('exists');
        } else {
          console.log('creating');
          firebase.child('person').set(person, (err) => {
            if (err) {
              throw err;
            }
          });
        }
        this.name = '';
      });

如果我摆脱更新逻辑而只拥有设置逻辑,我的数据将如下所示:

账单:0,

约翰:0,

贝丝:0

如果记录存在,它就没有问题(因为我什至还没有进行更新),但如果没有,它就会进入一个疯狂的循环,我最终会在我的表中得到一个值最后。

我认为我误解了如何构建数据。

我基本上想用一对人的键值对制作一个超级简单的应用程序,每个人都有 1 个单独的数字,如果该人已经存在,则将该值加一。

有人可以帮助我了解如何创建结构并查询它以进行更新吗?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database nosql


    【解决方案1】:

    您正在寻找once()。因为您只想检查人员节点当前是否存在并且不想继续同步它。所以:

      firebase.child(personQuery).once('value', (snapshot) => {
        if (snapshot.exists()) {
          // Update
          console.log('exists');
        } else {
          console.log('creating');
          firebase.child('person').set(person, (err) => {
            if (err) {
              throw err;
            }
          });
        }
        this.name = '';
      });
    

    但通常这种情况需要use of a transaction。通过事务,您可以获得当前值并以原子方式指定新值。这将删除当前代码中存在的竞争条件。

    【讨论】:

    • 非常感谢!我现在远离代码,但我会在明天尝试并报告,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    相关资源
    最近更新 更多