Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 防止对不使用';不存在火基_Firebase_Firebase Realtime Database - Fatal编程技术网

Firebase 防止对不使用';不存在火基

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

我有一个有趣的firebase数据库问题。我将带你经历它是如何发生的

步骤1:有一个由用户a发布的节点

      "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,它们实际上不是相同的图片,我会解决这个问题。我在做一个事务,但它仍然写着其他节点操作,它们实际上并没有重复。我在问题中修正了它好吧,对我来说,如果我去掉“!”的话,它的工作方式就是我所需要的,所以我只想在以前的数据存在的情况下才写。