2015-12-02 45 views
2

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

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

因此,功能是一样的东西

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

,当我使用它:

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

,博尔特产生的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更好一点。

顺便说一句,我无法想象在短时间内没有使用Bolt的规则。通过手工尝试完成巨大的进步。

回答

4

看到这里https://github.com/firebase/bolt/issues/87讨论:

的原因是微妙的(不是很明显):为了支持多位置更新,你需要能够编写将参照日期的“新”值的规则。 Bolt中的标准是在写入和验证规则中,thisroot引用是newData值(在读取规则中,这个和根是data - 旧/现有值)。

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

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

+0

我认为这可能是一个新的vs现有的东西。感谢您的解释。你知道Bolt是否支持或将支持将评论转交给json吗? – VladimirSD

+1

功能请求在问题跟踪器中欢迎:-) – mckoss