【问题标题】:Firebase Database weird behavior when updating + permission_deniedFirebase 数据库在更新 + permission_denied 时出现奇怪行为
【发布时间】:2019-09-14 22:15:54
【问题描述】:

我发现在权限被拒绝的情况下将数据更新到 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 个日志:

  • "foo" 将弹出 author = "foo" 的新节点。
  • @firebase/database:FIREBASE 警告:在 /books/1 更新失败:permission_denied
  • “foo”将使用旧节点(原作者)弹出。

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

任何解释为什么它表现得好像有更新?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database firebase-security


    【解决方案1】:

    这是预期的行为,但一开始确实会让人感到困惑。

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

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

    以图表形式:

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

    【讨论】:

    • 感谢 Puf,我一直在怀疑类似的事情。你(firebase 团队)为什么选择这种行为?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多