0

在 Firebase 安全规则文件中,是否可以有效地使用“.validate”指令来同步架构,即确保当 Firebase 的一部分被修改时,另一部分也得到更新?或者这是一个坏/无效的想法?

基本上我想做的是创建一个待办事项列表应用程序。我希望能够在我的待办事项列表中创建带有指定标签的任务。对于应用程序中的每个标签,我的 Firebase 后端的“标签”字段中应该有一个相应的标签子字段。标签字段应包含对“任务”字段中任务的有序引用列表。所以,如果一个任务是用“#foo”标签创建的,那么它的名字(id)应该在“tasks/foo”中引用。此外,每当一个任务被删除时,它在每个标签中的引用都应该被删除,并且当一个标签没有孩子时,它应该被删除。

为了澄清这里是模式的一个例子:

{
    "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”被删除,那么“购物”标签也会被删除。

总之,我需要以特定方式将“标签”模式与“任务”模式同步。我应该在安全规则中进行此同步吗?还是我应该在应用程序级别执行此操作?如果我在应用程序级别执行此操作,则存在应用程序出错并且不会添加/删除它应该添加/删除的标签的风险,那么我该如何克服呢?

4

1 回答 1

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())"
于 2013-09-17T14:03:46.943 回答