当Firestore文档不存在时处理“权限被拒绝”的正确方法是什么

Gra*_*ton 3 firebase google-cloud-platform google-cloud-firestore

我已经为 Firestore 编写了规则,但是,当文档不存在时,它会抛出“权限缺失或不足”错误。例如

firebase.firestore().collection('shipments').doc(order_doc_id)
.onSnapshot(fsResponse => {
...
)}
Run Code Online (Sandbox Code Playgroud)

order_doc_id当不存在时抛出“权限缺失或不足错误” 。

这是我的“shipments”集合的安全规则:

allow read: if request.auth != null && (resource.data.book_data.seller_id == request.auth.uid || resource.data.buyer_id == request.auth.uid)
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望它能够成功解决fsResponse.exists === false,然后向用户显示“未找到”屏幕,但事实并非如此,并且该错误没有说明文档的存在。

处理此案的正确方法是什么?

sam*_*man 9

这个答案建立在@RenaudTarnec答案之上。

当前规则失败的原因是它们在不存在的文档上使用时会引发错误。任何引发错误的规则都会被视为该规则阻止访问。

您当前的阅读规则:

allow read: if request.auth != null
            && (resource.data.book_data.seller_id == request.auth.uid
               || resource.data.buyer_id == request.auth.uid);
Run Code Online (Sandbox Code Playgroud)

对于存在的文档,如果访问用户是卖方或买方,则规则允许读取访问。但是,当文档不存在时,resource将会- 这会导致语法错误,您尝试读取对象上的null属性- 阻止读取。在 Firebase 控制台的规则园地中测试规则时,您可以看到此行为的实际效果。datanull

要允许读取不存在的文档,您需要添加 -check nullfor resource. 为了防止滥用,您可能仍然希望要求用户登录。

allow read: if request.auth != null
            && (resource == null
               || resource.data.book_data.seller_id == request.auth.uid
               || resource.data.buyer_id == request.auth.uid);
Run Code Online (Sandbox Code Playgroud)