我使用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"
我相信两者都是对的吗?去看看某个节点,确保那里有数据。 "写"需要很长的路才能到达同一个节点。在树上,然后向下。 规则有效,我实际上不会使用相同的函数进行读写,但我试图更好地理解Firebase规则和Bolt。
顺便说一句,在短时间内使用后,我无法想象在没有博尔特的情况下编写规则。试图手工完成它的巨大进步。答案 0 :(得分:4)
请参阅此处的讨论https://github.com/firebase/bolt/issues/87:
原因很微妙(不明显):要支持多位置更新,您需要能够编写引用" new"的规则。日期的价值。 Bolt中的标准是在写入和验证规则中,this
和root
引用是newData值(在读取规则中,this和root是data
- old / existing - values)。< / p>
理想情况下,我们在JSON规则中会有一个newRoot
变量 - 因此我们可以在这些情况下将root
转换为newRoot
。由于我们还没有(还),Bolt使用newData.parent()....生成等效规则(即对newData的相对引用)。
如果您没有使用多地点更新,并且希望Bolt生成更简单的规则,则可以使用prior(root)
代替root
。