【问题标题】:Why does Firebase trigger a child_added event for an update operation?为什么 Firebase 会为更新操作触发 child_added 事件?
【发布时间】:2020-09-03 12:39:25
【问题描述】:

我想知道 Firebase 实时数据库在以下情况下的行为。 (注意:由于我的生产版本有太多的规则和代码,我创建了一个最小版本,我可以在其中重现行为,以防您对我奇怪的安全规则感到疑惑)

SDK: Firebase JavaScript SDK: 7.19.1

代码:
两个版本都一样

const database = firebase.database();
const allUsersRef = database.ref("users");
const myUserRef = database.ref("users/1");

allUsersRef.on("child_added", (data) => {
  console.log("child_added", data.val());
});

allUsersRef.on("child_changed", (data) => {
  console.log("child_changed", data.val());
});

allUsersRef.on("child_removed", (data) => {
  console.log("child_removed", data.val());
});

myUserRef
  .update({
    name: "John",
  })
  .then(() => {
    console.log("update success");
  })
  .catch((error) => {
    console.log("update error", error);
  });

版本 1

安全规则:

{
  "rules": {
    ".write": false,
    "users": {
      ".read": "auth !== null",
      "$userId": {
        ".write": false,
      }
    }
  }
}

控制台输出


版本 2

安全规则:

{
  "rules": {
    ".write": false,
    ".read": false
  }
}

控制台输出


在这两个版本中,都不会向 Firebase 数据库写入任何内容,因为安全规则不允许这样做。

这里有两点我不明白:

  1. 我从this article 知道,Firebase 实时数据库操作是乐观的,这解释了为什么 child_added 会显示在控制台中,即使它从未写入数据库。但我不明白为什么会触发child_added 事件而不是child_changed 事件,因为它是update 操作而不是set 操作。

  2. 即使 Firebase 操作是乐观的并且在两个版本中都没有写入数据库,为什么行为会根据我的安全规则而有所不同?我会期待相同的控制台输出。

【问题讨论】:

标签: firebase firebase-realtime-database


【解决方案1】:

为什么 Firebase 会为更新操作触发 child_added 事件?

从您第一个屏幕截图中的流程来看,/users/1 似乎还不存在,这意味着该节点是在客户端乐观地创建的。无论您在代码中执行的写入操作类型如何,都会发生这种情况:行为基于数据库的转换,而不是 API 调用。

【讨论】:

  • 该条目尚不存在。这就解释了,谢谢。
  • 我很好奇你对我的另一个问题有什么想法。
  • 还没有,我还在想那个。鉴于我能够在不回答 #2 的情况下回答 #1,您确实应该将它们作为单独的问题发布。
  • 为第二个添加了一个新问题:stackoverflow.com/q/63727336/2416687
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多