javascript - 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
如果每部电影都不同,我很难理解它如何检查所有电影。而且,在模拟器中,我看到我只能测试read
,set
和update
方法。
有没有办法做到这一点?或者在推送电影之前手动检查客户端中的查询会更容易吗?
解决方案
您不能在安全规则中执行过滤查询。您可以返回数据库的唯一方法是您知道要读取的节点的完整路径。所以我认为你不能用安全规则来做到这一点。在添加无效数据后,请考虑使用 Cloud Functions 被动清除或将其标记为无效。或者,正如您提到的,如果有帮助,请先检查客户。
推荐阅读
- cassandra - 使用 Achilles 嵌入式 cassandra 6.1
- javascript - JqxGrid 虚拟滚动和分页
- vue.js - 为什么 toRefs 在 Vue 3 中没有按预期工作?
- python - 如果在多线程 python 应用程序中手动创建一个单独的线程(其中使用 time.sleep() 内部),这会影响性能吗?
- github - 如何删除使用“导入存储库”添加的 GitHub 存储库
- angular - Angular 单元测试覆盖一次成功,另一次失败
- amazon-web-services - 如何从 aws-sample/non-profile-blockchain 驱动 https?
- node.js - 如何修复 zsh:找不到命令:process.env.NODE_TLS_REJECT_UNAUTHORIZED
- c++ - 在静态内存部分创建/销毁对象
- javascript - 如何组合 Javascript 数组和对象?