【问题标题】:Firebase trigger on all collection items while only one has been updated所有集合项目上的 Firebase 触发器,而只有一个已更新
【发布时间】:2018-04-10 18:02:02
【问题描述】:

每次我使用具有相同值和属性的相同对象 (s3) 进行更新时,Firebase 都会触发事件“child_added”,即使没有要添加或更新的内容。 我通过在 firebase 控制台上修改主对象的子集合中的一些值进行了一些测试,并注意到它返回了第一个元素正确的快照,然后集合的所有其他元素作为“添加”元素。这不是真的,因为除了我执行操作的集合之外,集合没有改变。

我只需要当我发送存储在数据库中的相同对象时,firebase 会智能地识别出没有请求任何操作并且不需要激活触发器。

 var studentiRef = ref.child('studenti/' + s3.matricola);
    studentiRef.update(JSON.parse(JSON.stringify(s3)));

    studentiRef.on("child_changed", function(userSnapshot) {
      var tasseRef = userSnapshot.ref.child('tasse');
        tasseRef.on('child_added', function(itemSnapshot, prevKey){
          console.log('ADDED ON');
          console.log(itemSnapshot.key)
        })
    });

    studentiRef.on("child_changed", function(userSnapshot) {
        userSnapshot.ref.child('tasse').on('child_removed', function(itemSnapshot, prevKey){
          console.log('REMOVED ON');
          console.log(itemSnapshot.key)
        })
    });

    studentiRef.on("child_changed", function(userSnapshot) {
        userSnapshot.ref.child('tasse').on('child_changed', function(itemSnapshot, prevKey){
          console.log('CHANGED ON');
          console.log(itemSnapshot.key)
        })
    });

更新:

在发布更新之前,我做了一些实验,但没有成功。 这里是控制台、数据库和代码的图片。 对此发疯。 这里三张截图:1firebase data2snippet3console log

更新二: scenario

behaviours on modifying value in firebase

已解决: 通过从 github firebase 示例中获得灵感,我发现了使用 firebase 的一个常见错误:我没有对数据进行扁平化。 要继续使用我的数据结构(对象列表中的根对象),解决方案是触发每个对象的更新(伪代码: ref.update(root/childobject) n 次而不是 ref.update(root) . 如果其他人遇到这个问题,我会更好地解释。 始终,平整您的数据! (使用火力基地)

【问题讨论】:

  • 请粘贴 firebase 控制台的快照并显示您正在更新的对象,似乎您正在更新根对象,然后在根的子对象上运行 child_changed 事件,因此如果您只想获取更新的值获取对studentiRef 的子节点的引用并更新它
  • 我附上了三张截图

标签: javascript firebase firebase-realtime-database triggers


【解决方案1】:

这些事件很可能直接来自客户端 SDK,它不会检测是否存在实际更改。数据库服务器确实执行这样的检查,并且只有在发生实际更改时才会将更改发送给其他客户端。

更新:

当您调用 Firebase 客户端 + 服务器将节点更新为当前值时,其行为方式如下。

  1. 客户端触发本地事件以反映更新。所以child_changed 会触发。
  2. 客户端将更新发送到服务器。这是必需的,因为客户端和服务器可能(稍微)不同步,而服务器是唯一的真实来源。
  3. 服务器将更新与节点的当前值进行比较。如果相同,则过程在此处停止。
  4. 如果更新的值与当前值不同并且通过了验证/权限检查,则数据将提交到磁盘并广播给任何活动的侦听器。
  5. 如果更新值不同,但被验证/权限检查拒绝,服务器会向原始客户端发送拒绝消息,然后触发另一个 child_changed 事件以恢复本地更改。

【讨论】:

  • 我刚刚附上了三张截图
  • 我不确定如何读取数据+代码。您可以尝试在 jsbin 之类的网站中复制它吗?本地窗口应该为所有数据触发 child_* 事件,但如果您打开第二个窗口,它应该只显示是否有实际变化。
  • 感谢您的帮助。为了场景的完整性:有两个 nodejs 应用程序。每次运行时都会执行 refTasse.update。 95% 的时间它将使用相同的对象进行更新并且没有任何更改,所以我希望 firebase 不会触发任何事件。另一个 nodejs 应用程序正在监听 firebase 事件,没有前端。只有服务器端。我刚刚附上了一个新的截图,希望在原帖中的 UPDATE II 行中尽可能清晰
  • 我更新了我的答案以描述系统的行为方式,这在您的情况下可能更有用。
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多