首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问newData服务器变量的密钥?

如何访问newData服务器变量的密钥?
EN

Stack Overflow用户
提问于 2016-11-20 03:47:20
回答 1查看 1.1K关注 0票数 2

(如有必要进一步澄清,请参阅修订后的问题和评论)

给出这个数据结构

代码语言:javascript
复制
{
  "-KWz2G9JKtwqt5Kn-pL7":true
}

当我试图验证newData时,如何从Firebase验证规则中访问第一个值( "-KWz2G9JKtwqt5Kn-pL7“)?

下面请找出我原来的问题。

背景

联机示例显示,连接Firebase实体的最佳方法是使用索引,其中收集与另一个实体的节点内的一个实体相关的id。

例如;

代码语言:javascript
复制
"groups":{ 
...
  "members":{
   "userid-1":true, 
   "userid-2":true
   }
 }

我想用以下数据结构将索引发布到另一个实体下面的节点(队列/队列/任务),并使用下面描述的一组规则验证该数据结构:

代码语言:javascript
复制
{
  "-KWz2G9JKtwqt5Kn-pL7":true
}

数据结构是对任务实体(/任务/任务/tid)的引用,我想将其与单独实体的节点关联起来。

我计划将这些值放入字典中,并通过setValue添加。当我这样做时,Firebase应该应用一个验证规则。我想验证标识符是否存在于数据库的其他地方。

我的索引将类似于这个(其中标识符与存储在另一个位置的一组任务id相关)

代码语言:javascript
复制
"queues":{
....
   "K24395498054-p23"{
     "tasks": {
        "-KWz2G9JKtwqt5Kn-pL7":true,
        "-KWjewrkstwqt7Ln-pL3":true,
        "-KWjewgqjdsllfsn-pL5":true
      }
    }
 }

但是我不清楚如何在规则中解压缩newData服务器变量的第一个值,而在这种情况下,我没有子标识符。

我不是发送单数值,而是将字典发送到Firebase。

在这种情况下,newData应该等于

代码语言:javascript
复制
{
  "-KWz2G9JKtwqt5Kn-pL7":true
}

Nota Bene --这是一个有趣的附带说明;我尝试创建一个索引,但阅读setValue文档。它指出,该值将被覆盖。那么,如何在不覆盖现有值的情况下保存字典呢?

规则

代码语言:javascript
复制
{
  "rules": {
    ".read": "auth != null",
    "queues": {
      ".write":"auth.provider != 'anonymous'",
      "$qid": {
       "members" : {
         //unsure how to access the first value of the newData object without it having a label but the following shows what I am trying to accomplish
         ".validate":"root.child('tasks').hasChild('-KWz2G9JKtwqt5Kn-pL7')",
         }   
       }
     }
    }
  }

在这种情况下,我要确认添加的newData是一个有效的唯一标识符,它已经作为一个任务存在。在此规则中,任务将与队列实体相关联。

如果有帮助,请在下面查看我的实体地图:

另一个选择

如何创建一个与我在您的示例中看到的内容类似的索引?

来表示一组可能与用户关联的组.

代码语言:javascript
复制
"user_0" : {
....
    "groups" : { 
       "group_id0":true,
       "group_id1":true,
       "group_id2":true
    }
}

在此之后,如何验证在其他地方的组节点下是否确实存在group_id#

如果我能得到这个答案,我也许可以推断出我的需要。

更新

根据公认的答案,我成功地应用了以下规则,以取得预期的结果:

代码语言:javascript
复制
{
  "rules": {
    ".read":  "false",
    ".write": "(auth.provider != 'anonymous') && (auth != null)",

      "presence": {
        ".read": "(auth.provider != 'anonymous') && (auth != null)",
            ".write": "(auth.provider != 'anonymous') && (auth != null)",
      },

      "queues": { 
        ".read":"(auth != null)",
        ".write": "(auth.provider != 'anonymous') && (auth != null)",
            "$qid": {
                "tasks": {
                "$taskid": {
                    ".validate": "root.child('tasks').child($taskid).exists()"
                }
                }
            }
        },

      "tasks": {
         ".read": "(auth != null)",
          ".write": "(auth.provider != 'anonymous') && (auth != null)",
        "$taskid":{
          "queues":{
              "$qid": {
              ".validate":"root.child('queues').child($qid).exists()"              
              }
            }
          }
        },

       "users": {
          ".read": "(auth != null)",
          ".write": "(auth != null)",
            "$userid":{
            "groups":{
              "$gid": {
              ".validate":"root.child('groups').child($gid).exists()"              
              }
            },
            "roles":{
              "$rid": {
              ".validate":"root.child('roles').child($rid).exists()"              
              }
            },
            "metadata":{
             ".read": "(auth != null)",
             ".write": "(auth.provider != 'anonymous') && (auth != null)",
            }
          }
        },
        "roles": {
          ".read": "(auth != null)",
          ".write": "(auth != null)",
        },
       "groups":{
          ".read": "(auth != null)",
          ".write": "(auth != null)",
            },  
    } //eof-rules  
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-02 12:16:44

您需要在规则中添加另一个级别,以便可以为任务ID使用一个$变量:

代码语言:javascript
复制
{
  "rules": {
    ".read": "auth != null",
    "queues": {
      ".write": "auth.provider != 'anonymous'",
      "$qid": {
        "members": {
          "$taskid": {
            ".validate": "root.child('tasks').hasChild($taskid)"
          }
        }   
      }
    }
  }
}

然后可以使用setupdate将任务ID添加到索引中:

代码语言:javascript
复制
firebase
  .database()
  .ref("queues/K24395498054-p23/members/-KWz2G9JKtwqt5Kn-pL7")
  .set(true);

firebase
  .database()
  .ref("queues/K24395498054-p23/members")
  .update({ "-KWz2G9JKtwqt5Kn-pL7": true });
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40700491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档