Firestore安全规则中get()后调用exists()路径传参失效如何解决
问题原因
你遇到的报错本质是两个Firestore安全规则的常见坑:
- 没有做前置校验就直接读取get()返回的文档字段:如果
items/$(resource.data.itemId)这个文档不存在,或者文档里的parentId字段不是字符串/为空,后续调用exists时就会传入非法参数。 - 安全规则的路径插值语法不支持在
$()占位符外直接拼接符号或其他变量:你直接在路径里写$(parentId):$(request.auth.uid),解析器不会自动把这三部分拼成完整的文档ID,只会识别为非法路径片段。你之前用固定字符串能跑通,是因为固定值没有动态插值的解析冲突。
可行解决方案
先做前置合法性校验,再提前把目标文档ID拼接成单独变量,再传入exists的路径中即可,修正代码如下:
function validateAuth() { // 先校验目标文档存在,且parentId为字符串类型,避免空值/类型错误 let itemDoc = get(/databases/$(database)/documents/items/$(resource.data.itemId)); if (!itemDoc.exists || !(itemDoc.data.parentId is string)) { return false; } // 提前拼接完整的目标文档ID,不要在路径插值内做拼接操作 let targetDocId = itemDoc.data.parentId + ":" + request.auth.uid; return exists(/databases/$(database)/documents/other-items/$(targetDocId)); }
如果你的parentId字段存的是Firestore的Reference类型而非字符串,需要先通过itemDoc.data.parentId.id拿到对应的字符串ID再使用。
内容的提问来源于stack exchange,提问作者Taku
相关产品推荐
相关产品推荐

