Firestore模拟插入数据报Error running simulation未知错误排查
你遇到的Error running simulation — An unknown error occurred错误和安全规则内的函数数量无关,完全是规则的语法错误、逻辑漏洞、字段不匹配导致的,具体问题和修复方案如下:
1. 函数名大小写拼写错误
你定义的校验函数名为isValidQuotation(首字母Q大写),但后续调用时写为isValidquotation(首字母q小写)。Firestore安全规则严格区分大小写,找不到对应函数就会抛出未知错误。
- 修复方案:统一所有调用处的函数名拼写为
isValidQuotation
2. 函数调用参数缺失
你定义的isValidStringInput要求传入两个参数:输入内容input和最大长度maxSize,但在isOtherThanQuotations内调用时仅传入了第一个参数,参数不匹配导致执行报错。
- 修复方案:所有调用
isValidStringInput的位置补充第二个参数,比如:
isValidStringInput(request.resource.data.buyerUserId, 200)
3. 字段读取路径错误
3.1 isSelected字段路径错误
isSelected是quotations数组下子对象的字段,不是文档根级字段,你直接读取request.resource.data.isSelected会因为字段不存在报错。
- 修复方案:删除
isSelected函数,将对应校验挪到isValidQuotation内,校验当前传入的数组项的isSelected字段:
function isValidQuotation(item) { return quotations()[item].keys().hasAll( [ 'title', 'rate', 'quantity', 'measuremntUnit', 'isSelected', 'index', ]) && isValidStringInput(quotations()[item].title, 200) && isValidNumber(quotations()[item].rate) && isValidNumber(quotations()[item].quantity) && isValidStringInput(quotations()[item].measuremntUnit, 200) && isValidNumber(quotations()[item].index) // 校验当前quotation的isSelected字段 && quotations()[item].isSelected is bool; }
3.2 字段名拼写不匹配
你规则内校验的buyerPhotoUrl字段,在测试数据中拼写为buyerPhotUrl(少了字母o),会因为读取不到字段报错。
- 修复方案:统一规则和数据的字段拼写。
4. 校验字段缺失
你在isOtherThanQuotations内加了request.resource.data.createdAt == request.time的校验,但测试数据中没有传入createdAt字段,直接判断相等会报错。
- 修复方案:要么插入数据时补充
createdAt: FieldValue.serverTimestamp(),要么注释掉该校验规则。
5. 类型校验逻辑错误
你写的isValidNumber函数中,matches是字符串独有的方法,如果传入的input是int类型,直接调用matches会抛出类型错误。
- 修复方案:调整类型判断逻辑:
function isValidNumber(input) { return input is int || (input is string && input.matches('^[0-9]+$')); }
6. 数组校验逻辑冗余(可选优化)
你不需要逐个写下标判断数组每一项是否合规,直接用all方法即可,还可以支持任意长度的数组校验:
// 替换掉原来十几行的下标判断 && quotations().size() >= 1 // 可自行调整最大长度限制 && quotations().size() <= 20 && quotations().all(item => isValidQuotation(item))
内容的提问来源于stack exchange,提问作者Saugat Thapa

