我正在测试从无服务器角度应用程序部署的子集合查询。
我有一个顶级lvl集合用户(2个子文档),其中有一个嵌套的集合秘密,每个秘密都包含一个索引为contact_details的文档(对于两个用户而言)
对于Firestore规则,我使用
rules_version = '2';
match /databases/{database}/documents {
match /user/{path=**}/secret/{secret_id} {
allow read: if true;
}
}
在我的无服务器角度客户端上,我正在使用AngularFirestore来查询子集合机密,如下所示:
this.firestore.collectionGroup('secret').get().subscribe(
(sec) => { sec.forEach(el => console.log(el.data())) },
(error) => { console.error(error) }
);
我的预期行为是从嵌套在两个用户文档中的子集合机密中检索所有文档。 我从console.error语句得到的错误输出如下:
FirebaseError: "Missing or insufficient permissions."
FirestoreError index.cjs.js:350
fromRpcStatus index.cjs.js:15441
fromWatchChange index.cjs.js:15954
onMessage index.cjs.js:11877
startStream index.cjs.js:11806
getCloseGuardedDispatcher index.cjs.js:11846
newTail index.cjs.js:1688
invoke zone-evergreen.js:359
run zone-evergreen.js:124
scheduleResolveOrReject zone-evergreen.js:855
invokeTask zone-evergreen.js:391
runTask zone-evergreen.js:168
drainMicroTaskQueue zone-evergreen.js:559
invokeTask zone-evergreen.js:469
invokeTask zone-evergreen.js:1603
globalZoneAwareCallback zone-evergreen.js:1629
在Firestore规则模拟器中,我已经成功尝试查询:
get /user/(placeholder)/secret/contact_details
我还使用设置了预期功能的特权服务器(node.js)测试了子集合查询。我猜想我的安全规则已经关闭,但是当我根据文档修改了Firestore规则时,我无法弄清楚到底是什么问题。感谢您的帮助!
答案 0 :(得分:0)
经过更多尝试后,我得出结论,子集合查询规则必须以路径通配符 first 开始,例如:
match /{path=**}/secret/...
禁止接缝将它们嵌套在我之前尝试过的路线中:
match /user/{path=**}/secret/...
通过这些更改,我得到了预期的结果。