【问题标题】:What does existing and new data mean exactly?现有数据和新数据究竟意味着什么?
【发布时间】:2017-12-21 00:42:10
【问题描述】:

考虑以下规则:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": "!data.exists() || !newData.exists()",
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

根据文档,data表示尝试操作之前的数据,newData表示尝试操作之后的数据。

所以,考虑foo 包含以下字符串。因此data

"foo":{
"Jellybean",
"Kitkat",
"Lollipop",
}

如果进行添加操作,newData

"foo":{
"Jellybean",
"Kitkat",
"Lollipop",
"Marshmallow",
}

如果进行了删除操作,newData

"foo":{
"Jellybean",
"Kitkat",
}

如果进行了更新操作,newData

"foo":{
"Jellybean",
"Kitkat",
"Nougat",
}

我无法弄清楚".write": "!data.exists() || !newData.exists()" 在前两种情况下如何变为真,但在第三种情况下则不然。您能否清楚地了解datanewData 的含义以及它如何根据此规则禁止更新请求?

【问题讨论】:

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


    【解决方案1】:

    “数据”始终是数据库中的数据。

    In a Update ==>  "newData" is the combinated result after the update. 
    In a Insert ==>  "newData" is the data being introduced.
    

    在一次更新中,数据存在于数据库中,newData(组合结果)也存在:

    !data.exists() = false 
    !newData.exists() = false
    

    在删除操作中,newData 为空:

    !data.exists() = false 
    !newData.exists() = true
    

    如果您尝试在 /foo 中进行更新,则规则中的方法 data 和 newData 会返回:

    data = "foo":{
     "Jellybean",
     "Kitkat",
     "Lollipop",
     }
    
    newData = "foo":{
     "Jellybean",
     "Kitkat",
     "Lollipop",
     "Marshmallow",
    }
    

    newData 是元素“foo”在更新后在数据库中的样子。

    【讨论】:

    • 在更新的情况下 newData.exists() 如何为真?你能用上面的例子解释一下吗?
    • newData 是元素“foo”在更新后将如何在数据库中,在更新中始终为真,请检查更新后的答案。
    • 您给出的示例不是添加了新数据而不是更新吗?
    • 您混淆了状态,您更新了路由 /foo,添加或删除了字符串。您用其他数据更新“foo”中的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2015-10-29
    • 2020-06-05
    • 2021-08-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多