Firebase Storage规则调用Firestore.get报错求助
解决Firebase Storage规则中调用
firestore.get报错的问题 根据你的描述,使用firebase-tools 11.17.0模拟器时,Storage规则里firestore.exists可正常返回结果,但firestore.get持续抛出Service call error,可按以下步骤排查解决:
1. 确认Firestore文档结构与字段有效性
虽然firestore.exists返回true,仍需检查目标文档datasets/13ypyc346atp3gqywoqB中data.meta.privacy字段是否存在且为字符串类型。可直接在Firestore模拟器UI中查看文档内容,避免因字段缺失或类型不匹配引发隐性错误。
2. 升级firebase-tools到最新稳定版
你的firebase-tools版本(11.17.0)是2022年10月的旧版本,而跨服务安全规则属于同期刚推出的功能,早期模拟器可能存在兼容性Bug。执行以下命令升级:
npm install -g firebase-tools@latest
升级完成后重启所有模拟器,再测试规则执行情况。
3. 调整Firestore规则允许跨服务访问
当Storage规则调用Firestore的get方法时,请求由Firebase内部服务账号发起。如果你的Firestore规则限制了访问权限,可能会拒绝该请求。在firestore.rules中添加允许Storage服务访问的规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /datasets/{datasetId} { // 允许Storage规则读取该集合下的文档 allow read: if true; // 若需更严格控制,可验证请求来源为Storage服务账号(可选) // allow read: if request.auth.token.email == 'firebase-storage@system.gserviceaccount.com'; } } }
更新规则后重新部署到模拟器:
firebase deploy --only firestore:rules
4. 确保模拟器配置正确且同时启动
- 必须同时启动Firestore和Storage模拟器,使用命令:
firebase emulators:start --only firestore,storage - 检查
firebase.json中模拟器配置,确保两者使用同一主机(如localhost),避免跨域或网络不通的问题:{ "emulators": { "firestore": { "port": 8080, "host": "localhost" }, "storage": { "port": 9199, "host": "localhost" } } }
5. 优化规则函数的空值校验逻辑
为避免因文档数据结构异常导致的错误,修改shared函数增加逐层空值校验:
function shared(datasetId) { let doc = firestore.get(/databases/(default)/documents/datasets/$(datasetId)); // 逐层校验字段存在性,避免属性访问报错 return doc.data != null && doc.data.meta != null && doc.data.meta.privacy == 'public'; }
内容的提问来源于stack exchange,提问作者Kalen Michael
相关产品推荐
相关产品推荐

