title: 数据校验

本篇文档介绍使用规则表达式校验数据的合法性,只允许写入符合规则的数据。

设置校验规则

.validate 规则类型用于设置允许写入的数据格式和数据类型。

例如,限制写入 /foo 的数据必须是字符串类型且长度小于100:

  1. {
  2. "messages:"{
  3. "rules": {
  4. "content": {
  5. ".read": true,
  6. ".write": true,
  7. // 写入/foo 的数据必须是字符串类型且长度小于100。
  8. ".validate": "newData.isString() && newData.val().length() < 100"
  9. }
  10. }
  11. }
  12. }

注意:

  • 任何一个子节点的 .validate 规则校验失败,整个写操作都将失败;
  • 当删除节点时,.validate 表达式会被忽略。

data 和 newData

内置对象 data 用于获取数据操作前的原始数据。newData 用于获取数据操作之后的新数据。

例如,设置在指定节点下,不可以修改数据:

  1. // 可以写入数据或删除数据,但不能修改已有数据。
  2. ".validate": "!data.exists() || !newData.exists()"

定位到任一节点

内置变量 rootdatanewDataparent()child()方法用于定位到任一节点。

例如,电影评分超过 8 分,且电影已上映 ,那么可以收藏这部电影:

  1. {
  2. ".validate": "root.child('movie').val().exists() &&
  3. data.parent().child('score').val() > 8 &&
  4. newData.parent.child('isShow').val() === true "
  5. }

正则表达式校验数据

matches() 方法用于规则表达式正则校验。

例如,限制写入的数据是字符串,并且字符串是 1900-2099 年间的 YYYY-MM-DD 格式:

  1. ".validate": "newData.isString() && newData.val().matches(/^(19|20)[0-9][0-9][-\\/. ](0[1-9]|1[012])[-\\/. ](0[1-9]|[12][0-9]|3[01])$/)"

关于正则表达式校验的更多内容,请参考 API 文档