使用 Bolt 编译器的 Firebase 规则

Firebase rules with Bolt compiler

我正在使用 Firebase Bolt 编译器生成规则,我注意到它生成的读写规则不同。

我编写了一个函数来查看某个节点以查看那里是否存在有效数据。然后我在不同的部分使用该功能。

所以函数类似于

isValidInvite(r_id, invite_id) = root['invites'][r_id][invite_id] != null;

当我使用它时:

read() = isValidInvite($resource_id, $invite_id);
write() =isValidInvite($resource_id, $invite_id);

Bolt 生成的 json 是

".read": "root.child('invites').child($resource_id).child($invite_id).val() != null",
".write":"newData.parent().parent().parent().parent().child('invites').child($resource_id).child($invite_id).val() != null"

我相信两者是等价的吧?去查看某个节点并确保那里有数据。 "write" 走很长的路才到达同一个节点。上树再下来。 规则有效,我实际上不会对读取和写入使用相同的函数,但我试图更好地理解 Firebase 规则和 Bolt。

顺便说一句,我无法想象在使用了一小段时间后没有 Bolt 的情况下编写规则。与尝试手工完成相比有了很大的进步。

在此处查看讨论 https://github.com/firebase/bolt/issues/87:

原因很微妙(不明显):要支持多位置更新,您需要能够编写引用日期 "new" 值的规则。 Bolt 中的标准是,在写入和验证规则中,thisroot 引用是 newData 值(在读取规则中,this 和 root 是 data - old/existing - 值) .

理想情况下,我们会在 JSON 规则中有一个 newRoot 变量 - 因此在这些情况下我们可以将 root 转换为 newRoot。由于我们(还)没有,Bolt 使用 newData.parent().... 生成等效规则......(即对 newData 的相对引用)。

如果您不使用多位置更新,并且希望 Bolt 生成更简单的规则,您可以使用 prior(root) 而不是 root