Firestore 规则匹配父数据,仅适用于模拟器

我正在尝试制作一个简单的直接消息部分。我有一个包含一些元信息的文档和一个包含单个消息的子集合。当我尝试获取消息时,规则在模拟器中有效,但在 js 中我每次都得到:Uncaught (in promise) FirebaseError: Missing or enough permissions

mongodb结构:

  • 聊天室

    • 元信息(senderId/Name、recieverId/Name、时间戳等)

    • 消息

    • 姓名

    • 文本

    • 时间戳

    • 消息标识

    • 房间号

规则:

match /chatRooms/{chatRoom}  {

  allow create: if request.auth.uid != null;

  allow update, delete: if resource.data.uid == request.auth.uid;   


  function isChatPartner() {

   return parentDoc().receiverId == request.auth.uid || parentDoc().senderId == request.auth.uid;

  }


  function parentDoc() {

    return get(/databases/$(database)/documents/chatRooms/$(chatroom)).data;

  }


  match /messages/{message} {

    allow read: if isChatPartner();

  }


}

js请求:


db.collection("chatRoom").doc(_roomId).collection("messages").get().then(msg => {

   console.log(msg);

})

有谁知道可能有什么问题?


慕沐林林
浏览 167回答 1
1回答

BIG阳

您的数据库和规则不匹配。在规则中,顶级集合称为“chatRooms”,但在您的代码中,它称为“chatRoom”。集合名称需要完全匹配。还有一个问题。您的代码正在尝试获取子集合中的所有文档,但规则不允许这样做。规则正在检查某些字段的访问权限。这在安全规则中不起作用,因为规则不是过滤器(请务必阅读并理解这些文档)。查询只能请求肯定会通过规则的文档 - 规则不会检查每个文档并排除不匹配的文档。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript