Firebase验证 - 可选属性

Pat*_*kkx 1 javascript firebase firebase-security firebase-realtime-database

我的实际验证如下:

  ".write": true,  
   ".validate": "newData.child('name').isString() 
     && newData.child('surname').isString() 
     && newData.child('age').isNumber()",
Run Code Online (Sandbox Code Playgroud)

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

我的情况是,怎么说firebase age可选的,但如果它在那里(用户填写) - 它必须是一个数字

类似于maybe typeFlow或TypeScript(age?: number)

谢谢!:)

Fra*_*len 6

要使年龄可选,请将其验证规则向下移动到您尝试验证的特定值:

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

这样做的原因是验证规则仅在数据存在时触发,因此age仅在age属性存在时执行验证,完全按照您的意愿执行.

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

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

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