Javascript 如何制定Firebase规则,确保您只能在字段中输入某些内容?

Javascript 如何制定Firebase规则,确保您只能在字段中输入某些内容?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,比如说,我使用Firebase运行一个留言板,其中每个帖子都必须首先得到版主的批准 因此,帖子可以有三种“状态”之一: 未经审查 批准 拒绝 我发现制定这条规则的唯一方法是: { "rules": { "posts": { ".write": "newData.child('status').val() == 'unreviewed' || newData.child('status').val() == 'approved' || newDa

比如说,我使用Firebase运行一个留言板,其中每个帖子都必须首先得到版主的批准

因此,帖子可以有三种“状态”之一:

  • 未经审查
  • 批准
  • 拒绝
我发现制定这条规则的唯一方法是:

{
    "rules": {
        "posts": {
            ".write": "newData.child('status').val() == 'unreviewed' || newData.child('status').val() == 'approved' || newData.child('status').val() == 'rejected"
        }
    }
}

这看起来效率很低,而且不干燥。有没有其他方法可以确保字段的值始终是少数几个值中的一个?

安全规则语言是JavaScript的有限子集,因此无法完全清除重复。。。但是,您当然可以将其缩短一点,同时使其更不容易出错


旁注:避免安全问题 尝试中的一个问题是使用
.write
规则验证数据。如果任何父级或更高级别的规则授予对此子树的写访问权,则这些规则将被完全忽略

但不要担心,您只需将数据验证移到
。验证
规则即可。它们总是在写操作时进行评估和强制执行,唯一的例外是管理员用户


清理规则 重新构造规则以遵循预期的模式有助于极大地提高可读性,即使字符数不会少很多

{
  "rules": {
    "posts": {
      "$postId": {  // (1)
        ".validate": "newData.child('status').exists()", // (2)

        "status": {
          ".validate": "newData.val() == 'unreviewed' || newData.val() == 'approved' || newData.val() == 'rejected"
        }
      }
    }
  }
}
  • 我添加此级别是因为我假设您要存储一个帖子列表,而不仅仅是
    /posts
    下的一篇帖子
  • 应该在post上列出所需的子节点(或“字段”)。如果未在新帖子中设置
    状态的验证规则,则将忽略该规则


  • 另外,请看一下。它可以帮助您干燥安全规则并生成验证规则。

    谢谢!这很有帮助。我以前没听说过博尔特。