【发布时间】: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 数据库写入任何内容,因为安全规则不允许这样做。
这里有两点我不明白:
-
我从this article 知道,Firebase 实时数据库操作是乐观的,这解释了为什么
child_added会显示在控制台中,即使它从未写入数据库。但我不明白为什么会触发child_added事件而不是child_changed事件,因为它是update操作而不是set操作。 -
即使 Firebase 操作是乐观的并且在两个版本中都没有写入数据库,为什么行为会根据我的安全规则而有所不同?我会期待相同的控制台输出。
【问题讨论】:
-
注:为第二个增加了一个额外的问题:stackoverflow.com/q/63727336/2416687
标签: firebase firebase-realtime-database