【问题标题】:Allow fields but without obligation in firebase rules and validation允许字段但在 Firebase 规则和验证中没有义务
【发布时间】:2016-12-25 12:39:28
【问题描述】:

我想知道如何只允许现有或新对象中的某些新字段,但没有义务始终拥有所有这些字段。

例如我想验证一个产品对象 我允许名称、大小、价格、高度、宽度等字段,并且没有其他未列出的字段,但同时对象是有效的,只有其中一些字段。

".validate": "newData.hasChildren(['name', 'size','price', 'height', 'width',])"

我认为所有领域都是有义务的。因此,没有高度或宽度的新产品将是无效的。但我希望它们仍然有效,但不允许有人发明根本没有列出的新领域。

这也需要与现有产品和新产品一起使用。 提前感谢您的提示。

【问题讨论】:

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


    【解决方案1】:

    要只允许您想要的字段,请使用wildcard location(以 $ 开头的规则)。这将匹配您已指定的任何路径。

    来自docs...

    动态$变量也可以与常量并行使用 路径名称。在这个例子中,我们使用 $other 变量来 声明一个 .validate 规则,确保小部件没有子级 除了标题和颜色。任何会导致额外的写入 创建的孩子会失败。

    {
      "rules": {
        "widget": {
          // a widget can have a title or color attribute
          "title": { ".validate": true },
          "color": { ".validate": true },
    
          // but no other child paths are allowed
          // in this case, $other means any key excluding "title" and "color"
          "$other": { ".validate": false }
        }
      }
    }
    

    至于删除所有规则匹配的义务,你可以做他们在上面的例子中所做的事情。您还可以使用OR 作为验证规则的一部分:

    ".validate": "newData.hasChild('name') || newData.hasChild('size') || newData.hasChild('price')"
    

    【讨论】:

    • 感谢您的详细信息。这意味着我基本上在我的所有对象和孩子中使用 ""$other": { ".validate": false }" 以防止任何人创建尚未命名的新孩子。我也喜欢某些情况下的替代版本。我想我现在可以在你的帮助下完成所有设置。让我更清楚...
    • 太棒了@Oliver!如果信息为您解决了规则问题,请标记为解决方案。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多