我正在尝试制作一个简单的直接消息部分。我有一个包含一些元信息的文档和一个带有单个消息的子集合。 当我尝试获取消息时,规则在模拟器中有效,但是在js中,我每次都得到:未捕获(承诺)FirebaseError:缺少权限或权限不足。
mongodb结构:
规则:
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);
})
有人知道什么可能是错误的吗?
答案 0 :(得分:2)
您的数据库和规则不匹配。在规则中,顶层集合称为“ chatRooms”,但是在您的代码中,它称为“ chatRoom”。集合名称必须完全匹配。
还有另一个问题。您的代码试图获取子集合中的所有文档,但是规则不允许这样做。规则正在检查某些字段以供访问。自rules are not filters起,这在安全规则中将无效(请务必阅读并理解这些文档)。查询必须只请求肯定会通过规则的文档-规则不会检查每个文档并排除不匹配的文档。