问题描述
我正在使用angularfire并在实时数据库中进行批量更新
我没有写完整的路径到指定的对象,而是写了父母,而我传递的数据包含了其余的路径
例如,假设我有一个类似root/$date/$uid/myObject
我在规则中指定
{
"rules": {
"root" : {
"$date" : {
"$uid": {
".read": true,".write" : "auth.uid === $uid && $date.matches(/someregex/)"
}
}
}
}
在angularfire中,我执行以下操作
const data = {
"12-03-2020": {
"my-user-id": {
data: "Hello World!"
}
}
"12-04-1236": {
"my-user-id": {
data: "Hello World!"
}
},"12-06-1960": {
"my-user-id": null
},}
this.db.object('root').update(data).then(...)
在规则测试器中编写完整路径时,一切正常,但在我的应用程序上尝试时,我得到了Permission Denied
,当将write设置为true
时,该方法也有效
解决方法
更新语句实际上是作为更新对象中每个顶级键的set语句列表执行的。这意味着您的代码正在尝试写入root/12-03-2020
,root/12-04-1236
和root/12-06-1960
,并且那里没有写权限。
可以 执行特定属性的深度更新,但是您必须在密钥中指定属性的路径。因此,您问题中的JSON将折叠到此结构中,以(仅)对这些特定值执行深度更新:
const data = {
"12-03-2020/my-user-id/data": "hello world!","12-04-1236/my-user-id/data": "hello world!"
"12-06-1960/my-user-id": null
}
...