【问题标题】:How to update only certain fields from data through database rule?如何通过数据库规则仅更新数据中的某些字段?
【发布时间】:2016-06-27 16:26:39
【问题描述】:

我的数据库:

{ "user" :
    "$userID": {
        "name" : "Anon",
        "age" : 99
    }
}

如果客户端不小心发送了不正确的数据但有一些有效数据,有没有办法只用有效数据更新服务器?

例如,

user1.updateChildValues(["name" : "John Snow", "age" : 30, "BADKEY" : "BAD DATA"])

我希望上述更新尝试工作,但仅在上述情况下使用数据库安全规则以["name" : "John Snow", "age" : 30] 更新数据库。有没有办法做到这一点?

【问题讨论】:

  • 不确定,但恐怕你做不到。你应该更多地了解你的真正问题。是什么让你想做这种事?
  • 我一直在将separating public & private data 读入两个完全不同的节点。 AFAIK,对于用户数据库 ref 将需要分解为 users-publicusers-private,但我试图查看是否有针对我的特定用例的不同/更好的方法,因为我有东西在客户端实现。最后,我可能不得不更改客户端代码并重组我的数据库。

标签: firebase firebase-realtime-database firebase-security


【解决方案1】:

听起来你想在你的数据结构上实施一个模式。您可以在安全规则中通过验证属性(并拒绝不匹配的属性)来执行此操作:

{ "user" :
    "$userID": {
        ".validate": "newData.hasChildren('name', 'age')",
        "name": {
            ".validate": "newData.isString()"
        },
        "age" : {
            ".validate": "newData.isNumber()"
        },
        "$other": {
            ".validate": false
        }
    }
}

这里的$other 规则匹配任何没有被更明确的规则匹配的孩子,然后拒绝它们。

【讨论】:

  • 我可能没有清楚地解释我的问题。当客户端发送["name" : "John Snow", "age" : 30, "BADKEY" : "BAD DATA"] 时,我希望数据库将其解释为["name" : "John Snow", "age" : 30] 并相应地更新数据库。由于额外的键值对,您给我的答案给了我["name" : "John Snow", "age" : 30, "BADKEY" : "BAD DATA"] 的“权限被拒绝”。我想要一个比你写的规则更宽松的规则。最后,我试图做的可能是一种不好的做法,并且 Firebase 不支持。
  • 应该拒绝坏数据,而不是默默地忽略。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2014-08-09
  • 2018-01-24
  • 1970-01-01
  • 2020-09-18
  • 2018-01-14
  • 1970-01-01
相关资源
最近更新 更多