我正在尝试在firebase中定义一个模式,该模式将阻止某些子属性为空(如SQL中的NOT NULL约束)。
架构应如下所示:
Property | allow null | type
---------+------------+--------
name | false | string
phone | false | string
alias | true | string
birthday | true | number (timestamp)
此外,只有用户自己应该能够读写自己的联系人。
目前,数据库中有一些虚拟数据:
{
"contacts" : {
"user1" : {
"contact1" : {
"alias" : "Bobby",
"name" : "Bob",
"phone" : "12312324"
}
}
}
}
我提出的解决方案如下:
{
"rules": {
"contacts": {
"$user": {
"$contact": {
".read": "auth.uid == $user",
".write": "auth.uid == $user && newData.hasChildren(['name', 'phone'])",
"name": {
".validate": "newData.isString()"
},
"phone": {
".validate": "newData.isString()"
},
"alias": {
".validate": "newData.isString()"
},
"birthday": {
".validate": "newData.isNumber()"
},
"$other": {
".validate": "false"
}
}
}
}
}
}
这种方法的问题是每次我想要修补某个值(例如别名)时,由于newData.hasChildren(['name', 'phone']
,我必须提供非空属性(未更改)规则。
虽然我可以访问我的应用中的整个对象,但这是一个恼人的不便。
有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
这种方法的问题在于,每次我想要修补某个值(例如别名)时,由于{{1},我必须提供非空属性(不会被更改)规则。
您似乎误解了newData.hasChildren(['name', 'phone']
在规则中的含义。来自reference documentation of newData
:
newData
对应于如果允许写入将导致的数据。
因此,如果只将一个属性写入已包含所有属性的位置,则RuleDataSnapshot
变量将包含所有属性:未指定属性的现有值,以及属性的新值&# 39;重写。