首页 > 解决方案 > Firebase 验证规则检查是否已存在具有相同标题的电影

问题描述

我是 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方法。

有没有办法做到这一点?或者在推送电影之前手动检查客户端中的查询会更容易吗?

标签: javascriptfirebase-realtime-databasefirebase-security

解决方案


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


推荐阅读