javascript - 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 个日志:
- "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") | |
|<--------------------+ |
| | |
+ + +
推荐阅读
- mysql - mySQL 根据评论数量找到前 3 个帖子
- powerapps - 在 PowerApps 门户中显示 Dataverse 图像
- apache-kafka - Kafka Ignite Sink Connector - Ignite 的配置文件
- ios - 在 SwiftUI 中按日期分组
- javascript - 从 nginx 服务器获取 pdf 或 csv 下载的 href url 链接
- python-3.x - Discord.py 检测已删除消息不起作用
- php - 从 Live Hosted Server 到本地 XAMPP 的网站备份失败
- android - 在 Android 中以编程方式创建 URL 快捷方式
- flutter - 如何使 SliverGrid 居中?
- python-3.x - 在定义了“with”语句的类中多次尝试使用相同的 SUIT