【问题标题】:Listing all items with rules in firebase在firebase中列出所有具有规则的项目
【发布时间】:2018-02-03 14:43:23
【问题描述】:

我有一个 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 中复制所有可能与查询相关的数据?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    包含公共帖子密钥的列表确实是一种选择。其他选项是创建一个包含完整公共帖子的单独顶级节点。

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

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多