如何列出所有具有规则的项目" .read"在Firebase中评估为true?

时间:2017-07-03 18:35:05

标签: firebase firebase-realtime-database firebase-security

我有这个结构数据:

{
  "test" : {
    "a" : {
      "view" : true
    },
    "b" : {
      "view" : false
    },
    "c" : {
      "view" : true
    }
  }
}

我有这个规则:

{
  "rules": {
    "test": {
      // ".read": true,
      "$id": {
        ".read": "data.child('view').val() === true"
      }
    }
  }
}

使用以下代码:

ref.child('test/a').once('value',snap=>{
  console.log('a:',snap.val())
})
ref.child('test/b').once('value',snap=>{
  console.log('b:',snap.val())
})
ref.child('test').once('value',snap=>{
  console.log('all:',snap.val())
})

我只得到:

a: Object {view: true}

我希望得到这个结果(注意ball遗漏的方式{/ 1}}:

a: Object {view: true}
all: Object {a: Object, c: Object}

如果我在第4行".read": true的安全规则中取消注释,我会得到所有内容,这不是我想要的。

如何列出所有具有规则的项目" .read"在Firebase中评估为true?

更新

看起来按预期获得ac的唯一方法是创建包含所有项目的数组:

{
  "items" : [ "a", "b", "c" ],
  "test" : {
    "a" : {
      "view" : true
    },
    "b" : {
      "view" : false
    },
    "c" : {
      "view" : true
    }
  }
}

规则:

{
  "rules": {
    "test": {
      "$id": {
        ".read": "data.child('view').val() === true"
      }
    },
    "items" :{
      ".read": true
    }
  }
}

然后使用以下代码获得预期结果:

ref.child('items').once('value',snap=>{
  snap.forEach(item=>{
    ref.child('test/'+item.val()).once('value',snap=>{
      console.log(snap.key)
    })
  })
})

0 个答案:

没有答案