【问题标题】:Firebase avoid same node override/updated by multiple clients (web)Firebase 避免多个客户端(网络)覆盖/更新相同的节点
【发布时间】:2019-06-21 04:50:17
【问题描述】:

我正在使用 firebase 制作结帐系统,同一商店的多个用户可以同时覆盖/更新一个节点。

场景/步骤:

User1:在系统中输入商品代码(可以输入多个)

User2:在系统中输入商品代码(//)

User3:从系统中释放该项目代码

User4 ... 等等。

代码:

"-KhBgsi8HwT5BloV0Srt" : {
        "lastUpdated" : 1504285854767,
        "methodName" : "ITEM_ENTERED",
        "payLoad": "{'Id':1, 'ItemName': 'Apples'}"   
      }

在上面的代码中,每当任何用户输入时,我都会用方法名称和项目的 payLoad 覆盖上面的节点。并且每当用户从系统中释放项目时,我都会通过这样的覆盖再次更新同一节点:

"-KhBgsi8HwT5BloV0Srt" : {
            "lastUpdated" : 1504285854767,
            "methodName" : "ITEM_RELEASED",
            "payLoad": "{'Id':1, 'ItemName': 'Apples'}"   
          }

所有用户都连接到同一个 Firebase 节点,可以同时被上述用户覆盖。因此,如果所有用户同时进行操作,则节点将获得节点中保存的最后一个。我怎样才能避免这种情况并确保所有用户都获得相同的数据,而不是节点上发生的最后一个数据。

在某些时候,当用户快速完成所有事情时,上面的节点会与 ITEM_ENTERED/ITEM_RELEASED 方法混淆,并且客户端会不同步。

我希望我的观点很清楚。我只需要一个正确的方向来修复这个并发写入到同一个节点。

感谢任何帮助。 谢谢

【问题讨论】:

  • 但是你的问题没有详细说明如果两个用户写入同一个节点,应该应用哪个更新
  • 每个用户在写入上述节点时都会更新上述 firebase 节点的有效负载/方法名/lastupdated。
  • @Mocas 我想确保所有连接的设备都接收到每个动作/节点更新数据而不会跳过。
  • 那么宁愿保留一个节点,让每个人都更新,只需推送另一个节点
  • @Mocas 如果我推送另一个节点,我如何确保所有用户都看到最新数据。读取所有 json 节点而不仅仅是一个?对吗?

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


【解决方案1】:

评论越来越长,但这似乎是解决您问题的有效方法 只需推送另一个节点,并让您的侦听器返回最后推送的节点

不要使用child_changed,而是使用child_added

【讨论】:

  • 我明白你的意思,但目前我正在收听 child_changed 事件,如果我每次都使用上述方法添加节点,那么我应该使用 orderby 和 child_added 事件吗?
  • 更新了答案
  • 抱歉,再更新一次,我认为这会是一个更好的解决方案
猜你喜欢
  • 1970-01-01
  • 2015-03-02
  • 2018-03-31
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多