Firestore规则中可选字段类型校验的占位符使用是否正确?
Firestore规则字段类型校验的占位符问题解答
你提供的示例函数里,不同类型的占位符使用存在错误,既不能统一用'',也不是当前示例里的混用方式。正确的逻辑是:docData.get()的默认值必须与你要校验的目标类型一致,这样才能保证「可选字段不存在时校验通过,存在时校验类型匹配」的需求。
正确的占位符使用规则
- 校验
map类型:默认值用{}(空Map),空Map属于map类型,字段不存在时is map返回true - 校验
int类型:默认值用0(整数类型的默认值),不能用字符串'',否则'' is int会返回false,导致可选字段不存在时校验失败 - 校验
bool类型:默认值用false(布尔类型的默认值),同样不能用'' - 校验
string类型:默认值用''(空字符串)是正确的,空字符串属于string类型 - 校验
list类型:默认值用[](空列表)是正确的,空列表属于list类型
修正后的校验函数
function reviewFieldsAreValidTypes(docData) { return docData.get('variableA', {}) is map && docData.get('variableB', {}) is map && docData.get('variableC', 0) is int && docData.get('variableD', false) is bool && docData.get('variableE', '') is string && docData.get('variableF', []) is list; }
错误写法的问题说明
原示例中用''作为int、bool类型的默认值,会导致:当这些可选字段不存在时,docData.get()返回的是字符串'','' is int和'' is bool都会返回false,直接触发校验失败,违背了「可选字段不存在时允许通过」的设计初衷。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

