为什么Firebase会为更新操作触发子事件?

为什么Firebase会为更新操作触发子事件?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我想知道Firebase实时数据库在以下情况下的行为。(注意:因为我的产品版本有太多的规则和代码,所以我创建了一个最小版本,在这里我可以复制行为,以防您对我奇怪的安全规则感到疑惑) SDK:Firebase JavaScript SDK:7.19.1 代码: 两个版本保持相同 const-database=firebase.database(); const allUsersRef=database.ref(“用户”); const myUserRef=database.ref(“users/1

我想知道Firebase实时数据库在以下情况下的行为。(注意:因为我的产品版本有太多的规则和代码,所以我创建了一个最小版本,在这里我可以复制行为,以防您对我奇怪的安全规则感到疑惑)

SDK:
Firebase JavaScript SDK:7.19.1

代码:
两个版本保持相同

const-database=firebase.database();
const allUsersRef=database.ref(“用户”);
const myUserRef=database.ref(“users/1”);
allUsersRef.on(“添加的子项),(数据)=>{
log(“添加了child_”,data.val());
});
allUsersRef.on(“子项更改”,(数据)=>{
log(“child_changed”,data.val());
});
allUsersRef.on(“已删除子项”,(数据)=>{
log(“child_removed”,data.val());
});
myUserRef
.更新({
姓名:“约翰”,
})
.然后(()=>{
console.log(“更新成功”);
})
.catch((错误)=>{
日志(“更新错误”,错误);
});

版本1 安全规则:

{
“规则”:{
“.write”:false,
“用户”:{
“.read”:“auth!==null”,
“$userId”:{
“.write”:false,
}
}
}
}
控制台输出


版本2 安全规则:

{
“规则”:{
“.write”:false,
“.read”:错误
}
}
控制台输出


在这两个版本中,不会向Firebase数据库写入任何内容,因为安全规则不允许这样做。

有两件事我不明白:

  • 我知道Firebase实时数据库的操作是乐观的,这解释了为什么控制台中会显示
    child\u added
    ,即使它从未写入数据库。但我不明白的是,为什么会触发添加的
    child\u
    事件而不是更改的
    child\u
    事件,因为这是一个
    update
    操作,而不是
    set
    操作

  • 为什么基于我的安全规则,即使Firebase操作是乐观的,并且在两个版本中都没有写入数据库,行为也会有所不同?我本希望得到相同的控制台输出

  • 为什么Firebase会为更新操作触发子事件


    从您的第一个屏幕截图中的流来看,
    /users/1
    似乎还不存在,这意味着节点是在客户端创建的。无论您在代码中执行的写入操作类型如何,都会发生这种情况:行为基于数据库上的转换,而不是API调用。

    该条目尚不存在。这就解释了,谢谢。我很好奇你对我的另一个问题是否有想法。还没有,我还在想那个问题。考虑到我能够回答#1而不回答#2,你真的应该将它们作为单独的问题发布。为第二个问题添加了一个新问题:注意:为第二个问题添加了一个额外的问题: