Cloud Firestore规则中Exists()方法使用第二个变量失效问题求助
嘿,这个问题我碰到过类似的情况,大概率是手动拼接路径时的层级歧义导致的!
你当前的规则里手动拼接了完整路径,但因为你的路径结构里events既是根集合,又是子集合(/events/{season}/events/{code}),Firestore规则在解析变量替换后的路径时,可能出现了预期外的层级匹配错误——而当你换成具体的code值时,路径是完全明确的,所以能正常工作。
给你一个更可靠也更简洁的实现方式,利用Firestore规则内置的resource对象来直接定位当前文档的子集合,避免手动拼接路径的风险:
match /events/{season}/events/{code} { function isAuthorizedMember() { // 先确保用户已认证,再检查子集合vv中是否存在以用户uid为ID的文档 return request.auth != null && exists(resource.ref.collection('vv').doc(request.auth.uid)); } allow read: if isAuthorizedMember(); }
为什么这个方式更好?
resource.ref会直接指向当前匹配的/events/{season}/events/{code}文档,你不需要再手动传递season和code变量,完全避免了路径拼接错误。- 增加了
request.auth != null的校验,能防止未登录用户的请求触发不必要的错误,让规则更健壮。
如果还是想保留手动路径的写法,也可以尝试用更明确的路径分段来避免歧义,但显然用resource.ref的方式是Firestore官方推荐的最佳实践,代码更清晰也更不容易出错。
内容的提问来源于stack exchange,提问作者Vincent De Ridder
相关产品推荐
相关产品推荐

