Firestore安全规则:字段存在检测及求和时未定义字段处理咨询
解决Firestore安全规则中的金额求和与字段存在检测问题
一、修复金额求和函数(未定义字段按0计算)
你遇到的问题核心是:当字段未定义时,直接访问futureDocument().redAmount这类不存在的字段会抛出错误,导致规则校验失败。要让未定义字段按0计算,我们可以用两种方式处理:
方法1:使用Map的get()方法(推荐)
futureDocument().data是一个Map对象,get(key, defaultValue)方法会返回对应键的值,如果键不存在则返回你设置的默认值(这里设为0),完美规避字段不存在的报错:
function checkSums() { // 从未来文档中获取三个金额字段,不存在则取0 let redAmount = futureDocument().data.get('redAmount', 0); let greenAmount = futureDocument().data.get('greenAmount', 0); let blackAmount = futureDocument().data.get('blackAmount', 0); // 计算总和并与用户余额比较 return (redAmount + greenAmount + blackAmount) <= getUserDoc().amount; }
方法2:使用exists()函数判断
通过exists()检查字段是否存在,存在则取字段值,否则手动设为0,逻辑更直观:
function checkSums() { let redAmount = exists(futureDocument().redAmount) ? futureDocument().redAmount : 0; let greenAmount = exists(futureDocument().greenAmount) ? futureDocument().greenAmount : 0; let blackAmount = exists(futureDocument().blackAmount) ? futureDocument().blackAmount : 0; return (redAmount + greenAmount + blackAmount) <= getUserDoc().amount; }
这两种方法都能确保字段未定义时求和逻辑正常执行,不会因为报错中断规则校验。
二、检测文档字段是否存在
在Firestore安全规则中,使用exists()函数就能轻松检测字段是否存在,分两种常见场景:
1. 检测更新前的当前文档字段
如果要验证更新前的原始文档是否包含某个字段,用resource.data(当前文档的快照数据):
// 检查当前文档是否存在`redAmount`字段 allow update: if exists(resource.data.redAmount);
2. 检测更新后的未来文档字段
如果要验证更新后的文档是否包含某个字段,用request.resource.data(或v2规则中的futureDocument().data):
// 检查更新后的文档是否存在`greenAmount`字段 allow update: if exists(request.resource.data.greenAmount); // 或者用v2规则的futureDocument()写法 allow update: if exists(futureDocument().data.greenAmount);
进阶:同时校验字段存在和类型
如果需要确保字段不仅存在,还符合业务要求(比如金额必须是非负数字),可以结合类型判断:
allow update: if exists(request.resource.data.redAmount) && request.resource.data.redAmount is number && request.resource.data.redAmount >= 0;
内容的提问来源于stack exchange,提问作者filip
相关产品推荐
相关产品推荐

