Firestore Rules嵌套函数中exists函数无法识别问题求助
解决Firestore规则自定义函数中
exists()无法识别的问题 这个问题其实是Firestore规则自定义函数的作用域和变量解析机制导致的:当你直接在allow规则里写exists(/databases/$(database)/documents/mycollection/$(docId))时,$(database)引用的是顶层全局的database变量,这个变量在规则块的作用域内可以直接解析;但把这段逻辑封装到自定义函数后,函数内部无法自动继承这个全局变量的模板解析上下文,导致exists()无法正确识别路径。
这里有两种可靠的解决方法:
方法1:将database作为参数传入函数
把全局的database变量显式传递给自定义函数,确保函数内部能正确解析路径:
// 顶层定义函数,接收database和docId两个参数 function doesDocExists(database, docId) { return exists(/databases/$(database)/documents/mycollection/$(docId)); } // 在规则中调用时传入全局的database变量 match /your-target-collection/{docId} { allow create: if ... && doesDocExists(database, docId); }
方法2:使用request.database.name获取当前数据库
利用Firestore规则的内置request对象,直接在函数里获取当前数据库名称,无需额外传参:
function doesDocExists(docId) { // request.database.name 等价于顶层的database变量,返回当前数据库名称(如"(default)") return exists(/databases/$(request.database.name)/documents/mycollection/$(docId)); } // 调用时直接传入docId即可 match /your-target-collection/{docId} { allow create: if ... && doesDocExists(docId); }
两种方法都能解决你遇到的问题,选择哪种取决于你的代码结构偏好——如果函数需要复用在不同数据库场景,方法1更灵活;如果只针对当前数据库,方法2更简洁。
内容的提问来源于stack exchange,提问作者Eliya Cohen
相关产品推荐
相关产品推荐

