列出firebase中包含规则的所有项目

时间:2017-08-25 14:07:57

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

我有一个firebase数据库,用户可以在其中提交posts。如果帖子是私下提交的,则其他用户无法阅读。

请参阅数据库和以下规则:

// FIREBASE DATABASE:
{
  "posts" : {
    "-PaNtmNIFp9sTT549-Kn" : {
      "author" : "XXXYYY",
      "content" : "New post",
      "public" : true
    },
    "-PaNw0ak27MfcU5Vff1t" : {
      "author" : "XXXYYY",
      "content" : "Secret post",
      "public" : false
    },
    "-PaOPhX3SwRe2ThEFWJo" : {
      "author" : "XXXYYY",
      "content" : "another post",
      "public" : true
    }
  },
  "user-posts" : {
    "XXXYYY" : {
      "-PaNtmNIFp9sTT549-Kn" : true,
      "-PaNw0ak27MfcU5Vff1t" : true,
      "-PaOPhX3SwRe2ThEFWJo" : true
    }
  }
}

// RULES:
{
  "rules": {
    "posts": {
      "$post": {
         ".read": "auth !== null && data.child('public').val() === true || data.child('author').val() === auth.uid"
       }
    }
  }
}

这种方法很好,但只有当我通过邮寄方式检索项目时才能正常工作:

// DOES NOT WORK
firebase.database().ref().child('posts').on('value', snap => {
  console.log(snap.val())
});

// DOES WORK
var children = ["-PaNtmNIFp9sTT549-Kn", "-PaNw0ak27MfcU5Vff1t", "-PaOPhX3SwRe2ThEFWJo"];
children.forEach(function(child) {
  rootRef.child(child).on('value', snap => {
    console.log(snap.val())
  })
})

我猜Rules are not Filters,对吧?然后我的问题变成了:

  • 如何使用正确的实体提示用户查找?我应该使用所有公共帖子密钥创建一个单独的节点,即名为publicPosts
  • 如果我仍然希望能够通过内容对公共帖子进行查询排序,我该如何进行此操作?只需复制可能与新节点publicPosts中的查询相关的所有数据?

谢谢!

1 个答案:

答案 0 :(得分:1)

带有公共帖子键的列表确实是一种选择。其他选项是使用完整的公共帖子创建单独的顶级节点。

事实上:为了能够对数据进行排序,该数据必须对用户可读。如果您只想按时间戳排序,可以将该时间戳作为值(而不是现在的*)。但是对于更复杂的查询,您需要复制更多数据。在某些时候,你最好复制整个帖子。