gpt4 book ai didi

javascript - Firebase 数据库更新时的奇怪行为+permission_denied

转载 作者:行者123 更新时间:2023-12-02 22:57:06 30 4
gpt4 key购买 nike

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

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

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的客户端上(幸运的是)。更新不起作用。确认我打开了另一个浏览器并且没有日志弹出。

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

最佳答案

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

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

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

以图表形式:

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

关于javascript - Firebase 数据库更新时的奇怪行为+permission_denied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57933821/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com