Firebase验证规则,以检查是否已经存在具有相同标题的电影

时间:2019-02-11 16:50:59

标签: javascript firebase-realtime-database firebase-security-rules

我是Firebase的新手。我正在开发一个搜索电影并将其保存在实时数据库中的应用程序。要保存的数据采用以下结构:

var movieData = {
    title: "Frozen",
    genre: "Animation"
};

我这样保存电影:

database.ref().child("movies").push(movieData);

这正常。如果我尝试将其保存两次,则会出现问题,因此,在我的数据库中,电影会被复制:

{
  "movies" : {
    "-LYSENT90rjBj_fIAHpY" : {
      "genre" : "Animation",
      "title" : "Frozen"
    },
    "-LYSEPufvX3p3w-yXf4d" : {
      "genre" : "Animation",
      "title" : "Frozen"
    }
  }
}

我正在尝试创建一个验证规则,以检查是否已经存在具有相同标题的电影。我最后的尝试是这样:

{
  "rules": {
    ".read": true,
    ".write": true,
    "movies": {
      "$pushid" : {
        ".validate": "root.child('movies/' + newData.child('title').val()).val() === null"
      }
    }
  }
}

如果每个电影的pushid不同,我很难理解它如何检查所有电影。此外,在模拟器中,我看到我只能测试readsetupdate方法。

有什么办法可以做到这一点?还是在推送电影之前在客户端中手动查询查询会更容易?

2 个答案:

答案 0 :(得分:0)

您不能在安全规则中执行过滤的查询。可以返回数据库的唯一方法是,如果知道要读取的节点的完整路径。因此,我认为您将无法使用安全规则来做到这一点。在添加数据之后,可以考虑使用Cloud Functions反应性地清除无效数据,或将其标记为无效数据。或者,正如您提到的,如果有帮助,请先检查客户端。

答案 1 :(得分:0)

如何使用像Animation_Frozen这样的pushid。您可以在客户端添加两个字符串。

database.ref().child("Animation"+"_"+"Frozen").set(movieData)