为什么Firebase会为更新操作触发子事件?
我想知道Firebase实时数据库在以下情况下的行为。(注意:因为我的产品版本有太多的规则和代码,所以我创建了一个最小版本,在这里我可以复制行为,以防您对我奇怪的安全规则感到疑惑) SDK:为什么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 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数据库写入任何内容,因为安全规则不允许这样做。 有两件事我不明白:
child\u added
,即使它从未写入数据库。但我不明白的是,为什么会触发添加的child\u
事件而不是更改的child\u
事件,因为这是一个update
操作,而不是set
操作
从您的第一个屏幕截图中的流来看,
/users/1
似乎还不存在,这意味着节点是在客户端创建的。无论您在代码中执行的写入操作类型如何,都会发生这种情况:行为基于数据库上的转换,而不是API调用。该条目尚不存在。这就解释了,谢谢。我很好奇你对我的另一个问题是否有想法。还没有,我还在想那个问题。考虑到我能够回答#1而不回答#2,你真的应该将它们作为单独的问题发布。为第二个问题添加了一个新问题:注意:为第二个问题添加了一个额外的问题: