也许我从 SQL 的角度过多地解决了这个问题,但我在理解如何正确限制应该允许哪些子节点填充节点方面遇到了困难。
假设我想记录任意名称的产品。每个产品必须包含一个price
,但不允许有其他任何事情。
我天真的方法是添加一个.validate
要求 newData 包含的产品的规则price
孩子,显式授予对的写访问权限price
节点,然后删除所有访问$other
节点(有点像 switch 语句中的默认子句):
{
"rules": {
"$product": {
".read": true,
".write": true,
".validate": "newData.hasChildren(['price'])",
"price": {
".write": true,
".validate": "newData.isNumber()"
},
"$other": {
".read.": false,
".write": false,
}
}
}
}
This does not work. Adding a new product with {"price": 1234, "foo": "bar"}
will still be accepted. If I however add a ".validate": false
rule to $other
, nothing is accepted instead (e.g. {"price": 1234}
is not allowed). (I did that wrong, somehow.)
有什么方法可以实现与我在这里尝试做的类似的事情吗?如果不是,限制 Firebase 中数据结构的正确方法是什么?我到底应该这样做吗?如果我不这样做,什么会阻止用户向我的数据库填充垃圾?