简单的Firebase验证规则(isNumber)无效

时间:2017-07-05 15:11:43

标签: validation firebase firebase-realtime-database

数据库结构(Firebase Console - Data):

{
"competitors": {
    0: {
        "name": "Arnold",
        "position": 1
    },
    1: ...
}

规则:

{
    "rules": {
        ".read": true,
        ".write": true,

        "competitors": {
            "$competitor": {
                "position": {
                    ".validate": "newData.isNumber()"
                }
            }
        }
    }
}

当我尝试模拟从控制台模拟器添加字符串值时,规则正常 - 报告违反规则。但是当我真正添加或更改位置的值作为字符串(来自Firebase控制台)时,会添加该值而不会出错。

如何正确设置仅允许数字值的验证规则?

更新(基于Oussema的评论)

以下替代形式给出了相同的结果:

{
    "rules": {
        ".read": true,
        ".write": true,

        "competitors": {
            "$competitor": {
                ".validate": "newData.child('position').isNumber()"
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您需要使用val()这样读取值:

".validate": "newData.val().isNumber()"

答案 1 :(得分:0)

您已经做对了,但这是要抓住的地方

  

如果您直接通过以下方式编辑数据,则Firebase规则将不起作用   firebase console。而是尝试使用以下命令更新或设置数据   firebase SDK,它应该引发错误PERMISSION_DENIED


示例:考虑一个非常简单的数据库

{
  number_only: 3
}

非常简单的规则

{
  "rules":{
     "number_only":{
       ".write": true,
       ".validate": "newData.isNumber()"
     }
  }
}

测试:

  1. 通过控制台将number_only设置为“ str”-应该可以工作
  2. 使用Firebase Javascript SDK-firebase.database.ref('number_only').set('str')-会引发错误