Firebase 防止对不使用';不存在火基
我有一个有趣的firebase数据库问题。我将带你经历它是如何发生的 步骤1:有一个由用户a发布的节点Firebase 防止对不使用';不存在火基,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,我有一个有趣的firebase数据库问题。我将带你经历它是如何发生的 步骤1:有一个由用户a发布的节点 "20180104" : { "-L2DNnIkER8XaBOI4n9l" : { "ImageName" : "EaWpwOXjmFsVatbkBM6V1307.jpg", "favoriteCount" : 12, "fileURL" : "https://storage.googleapis.com/...", "vie
"20180104" : {
"-L2DNnIkER8XaBOI4n9l" : {
"ImageName" : "EaWpwOXjmFsVatbkBM6V1307.jpg",
"favoriteCount" : 12,
"fileURL" : "https://storage.googleapis.com/...",
"viewCount" : 20,
"reportCount" : 2,
"setID" : "-L2DNknqYN0IzTUN6pe-",
"thumbFileUrl" : "https://storage.googleapis.com/...",
"user" : "uid"
},
"-ABCDnIkER8XaBOI4n9l" : {
"ImageName" : "EaWpwOXjmFsVatbkBM6V1307.jpg",
"favoriteCount" : 3,
"fileURL" : "https://storage.googleapis.com/...",
"viewCount" : 8,
"reportCount" : 2,
"setID" : "-L2DNknqYN0IzTUN6pe-",
"thumbFileUrl" : "https://storage.googleapis.com/...",
"user" : "uid"
},
步骤2:用户B从firebase获取此信息。。现在,他们在应用程序中本地安装了JSON
步骤3:用户A从firebase中的节点删除第二个图像密钥
步骤4:firebase中生成的JSON是:
"20180104" : {
"-L2DNnIkER8XaBOI4n9l" : {
"ImageName" : "EaWpwOXjmFsVatbkBM6V1307.jpg",
"favoriteCount" : 12,
"fileURL" : "https://storage.googleapis.com/...",
"viewCount" : 20,
"reportCount" : 2,
"setID" : "-L2DNknqYN0IzTUN6pe-",
"thumbFileUrl" : "https://storage.googleapis.com/...",
"user" : "uid"
},
// second node is now deleted
第五步:现在用户A决定“喜欢”第二张照片,导致写入数据库
步骤6:我们在firebase中生成的数据库:
"20180104" : {
"-L2DNnIkER8XaBOI4n9l" : {
"ImageName" : "EaWpwOXjmFsVatbkBM6V1307.jpg",
"favoriteCount" : 12,
"fileURL" : "https://storage.googleapis.com/...",
"viewCount" : 20,
"reportCount" : 2,
"setID" : "-L2DNknqYN0IzTUN6pe-",
"thumbFileUrl" : "https://storage.googleapis.com/...",
"user" : "uid"
},
"-ABCDnIkER8XaBOI4n9l" : {
"favoritecount": 13
// now we have corrupted data :(
}
我想阻止第6步中的最终写入。安全规则在一旁,但似乎无法理解它们是如何工作的。说“.如果父密钥不存在,不要写入它?”您的通用id实际上是重复的,即
-L2DNIker8SABOI4N9L
是完全相同的密钥。图像也是完全相同的图像。似乎每个图像都有一个唯一的密钥。一旦您解决了这个问题,使用事务处理共享计数器,例如like或start
例如,在示例社交博客应用程序中,您可以允许
用户可以访问star和unstar帖子,并跟踪帖子中有多少星星
已收到下列文件:
function toggleStar(postRef, uid) {
postRef.transaction(function(post) {
if (post) {
if (post.stars && post.stars[uid]) {
post.starCount--;
post.stars[uid] = null;
} else {
post.starCount++;
if (!post.stars) {
post.stars = {};
}
post.stars[uid] = true;
}
}
return post;
});
}
如果发生以下情况,使用事务可防止星计数不正确
多个用户同时发布同一帖子,或者客户端
陈旧的数据。如果事务被拒绝,服务器将返回
客户端的当前值,该客户端使用
更新值。重复此操作,直到事务被接受或您
中止事务
假设您的pic密钥没有像示例中那样重复,您可以防止对不存在的节点进行写入,如下所示:
"picDirectory" {
"$picID": {
".write": "data.exists()"
}
}
以下是相关的图片。oops,它们实际上不是相同的图片,我会解决这个问题。我在做一个事务,但它仍然写着其他节点操作,它们实际上并没有重复。我在问题中修正了它好吧,对我来说,如果我去掉“!”的话,它的工作方式就是我所需要的,所以我只想在以前的数据存在的情况下才写。