在Firebase安全规则文件中,是否可以有效地使用“.validate”指令来同步架构,也就是说,确保在修改Firebase的某个部分时,另一部分也会更新?或者这是一个糟糕/无效的想法?
基本上我要做的是创建一个Todo列表应用程序。我希望能够使用指定的标签在我的待办事项列表中创建任务。对于应用中的每个代码,我的Firebase后端的“代码”字段中应该有相应的代码子字段。标记字段应包含“任务”字段中任务的引用的有序列表。因此,如果使用“#foo”标记创建任务,则应在“tasks / foo”中引用其名称(id)。此外,每当删除任务时,应删除每个标记中的引用,当标记中没有子项时,应将其删除。
这里是一个模式的例子:
{
"tasks": {
"-sdjfaowneono": {
"headline": "Get some milk",
"completed": false,
"tags": {
"0": "all",
"1": "shopping"
}
},
"-asdfhsadfsafwirn": {
"headline": "Pick up the kids",
"completed": false,
"tags": {
"0": "all"
}
}
},
"tags": {
"all": {
"0": "-sdjfaowneono",
"1": "-asdfhsadfsafwirn"
},
"shopping": {
"0": "-sdjfaowneono"
}
}
}
同样,如果删除了“-sdjfaowneono”任务,那么“shopping”标签也会被删除。
总之,我需要以特定方式将“标签”架构与“任务”架构同步。我应该在安全规则中执行此同步吗?或者我应该在应用程序级别执行此操作?如果我在应用程序级别执行此操作,则存在应用程序错误并且不添加/删除应该标记的风险,那么我该如何克服该问题呢?
答案 0 :(得分:0)
要将此与安全规则一起使用,您需要更改其中一个以使用标记ID作为键,而不是数组值,因为无法指定通配符或搜索多个子项以查看如果一个包含正确的值。
因此,如果您将“标记”路径更改为如下所示:
"tags": {
"all": {
"-sdjfaowneono": true,
"-asdfhsadfsafwirn": true
},
"shopping": {
"-sdjfaowneono": true
}
}
然后你可以这样验证:
"tasks": {
"$task": {
"tags": {
"$tag": {
".validate": "root.child('tags/'+newData.val()+'/'+$task).exists()"
}
}
}
}
这揭示了我在使用Firebase构建时发现的基本设计实践:我倾向于使用键来存储任何类型的外键引用的值。
另外,请记住,这只会强制它们在写入时匹配。它确实有助于删除,因为.validate只有在值存在时才会运行。
您可以通过将此附加到写入规则来对删除执行相同的行为:
".write": " ... && (newData.exists() || !root.child('tags/'+newData.val()+'/'+$task).exists())"