首页 > 解决方案 > Firebase 数据库在更新 + permission_denied 时出现奇怪的行为

问题描述

在将数据更新到 RDB 并拒绝权限时,我发现了一个奇怪的行为。

重现“错误”所需的最少代码示例:

getBooks() {
   firebase.database().ref("books/1").on("value", data => {
      console.log("foo", data.val());
   }
}

setAuthor() {
   firebase.database().ref("books/1").update({ "author": "foo" });
}

假设我们订阅了 getBooks 以获取每次更改的数据。

setAuthor现在让我们使用方法更新作者。

如果我们获得所需的许可会发生什么?

→ 一切正常。日志“foo”将与 author =“foo”的新节点一起弹出。

如果我们没有所需的许可会发生什么?

→ 按以下顺序记录 3 个日志:

注意:这种奇怪的行为只发生在尝试更新的客户端上author(幸运的是)。更新不起作用。确认我打开了另一个浏览器并且没有弹出日志。

任何解释为什么它的行为就像有更新?

标签: javascriptfirebasefirebase-realtime-databasefirebase-security

解决方案


这是预期的行为,但起初确实可能令人困惑。

当您在客户端上执行写入操作时,Firebase 会立即在本地侦听器上触发事件。它在不等待服务器响应的情况下执行此操作,这也是 Firebase 写入对本地用户而言似乎立即的部分原因。

然后它将写操作发送到服务器,并等待响应。响应可以是写操作的确认或拒绝。如果服务器拒绝写入操作,Firebase 客户端会触发事件以使客户端应用再次进入正确状态。

以图表形式:

     client app             SDK              Server
       +                     +                  +
       |                     |                  |
       |    write("new")     |                  |
       +-------------------->|                  |
       |                     |                  |
       |  on("value", "new") |                  |
       |<--------------------+                  |
       |                     |                  |
       |                     |   write("new")   |
       |                     +----------------->|
       |                     |                  |
       |                     |      reject      |
       |                     |<-----------------+
       |                     |                  |
       |  on("value", "old") |                  |
       |<--------------------+                  |
       |                     |                  |
       +                     +                  +

推荐阅读