【问题标题】:Firebase validation - optional propertyFirebase 验证 - 可选属性
【发布时间】:2018-06-23 10:06:19
【问题描述】:

我的实际验证如下:

  ".write": true,  
   ".validate": "newData.child('name').isString() 
     && newData.child('surname').isString() 
     && newData.child('age').isNumber()",

但是,age 属性是可选。用户可以填写或不填写,取决于他的决定。

我的情况是,如何告诉 firebase age可选,但如果它存在(用户填写) - 它必须是一个 数字 ?

Flow 或 TypeScript 中的 maybe type 之类的 (age?: number)

谢谢!:)

【问题讨论】:

  • 为什么不在您的客户端javascript中简单地将其设置为0?换句话说,var userAge = 0.
  • @RonRoyston 这是一个黑客。我不想要任何黑客:P

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


【解决方案1】:

要使年龄可选,请将其验证规则移至您要验证的特定值:

".write": true,  
".validate": "newData.child('name').isString()  && newData.child('surname').isString()"
"age": {
  ".validate": "newData.isNumber()"
}

这样做的原因是验证规则仅在数据存在时触发,因此age 上的验证仅在存在年龄属性时执行,完全符合您的要求。

一般来说,我建议将类型验证下移到子节点,并且只在更高级别保留“这些属性必须存在”:

".write": true,  
".validate": "newData.hasChildren(['name', 'surname'])",
"name": { 
  ".validate": "newData.isString()" 
},
"surname": { 
  ".validate": "newData.isString()" 
},
"age": {
  ".validate": "newData.isNumber()"
}
"$other": {
  ".validate": false
}

上面的最后一个验证确保指定的属性被允许,因此用户不能添加其他数据(您的代码可能无法处理)。

【讨论】:

  • 谢谢弗兰克。还有一件小事——validation 中是否有包含所有可能规则的文档,例如isString()isNumber() 等等?我正在寻找 isArray()isObject()isEmpty() 等规则
  • 应该是firebase.google.com/docs/reference/security/database,但您要查找的方法不存在(我也没有发现需要它们)。
  • 没有找到任何关于对象的信息,但我只是使用了.exists() 并且看起来效果很好。但是,它不检查对象是否为空,所以它不是最好的解决方案:/
  • 验证规则仅用于验证数据是否遵循定义的结构。如果您写入空值/删除节点,它们不会触发。如果您想确保数据不会被删除,您可以发送".write": "newData.exists()
  • 好收获。固定的。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2014-12-25
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多