如何在Refit中填充Firestore规则所需的request.resource.data字典?
解决Firestore规则中
request.resource.data未定义的问题 1. 先确认操作类型是否匹配
request.resource.data 只在创建(POST)、更新(PATCH/PUT)文档的写入请求中存在,读取请求(GET)里根本没有这个字段。如果你的规则在读取逻辑里也用到了这个条件,直接会触发未定义错误。
- 调整规则区分读写操作,示例:
match /target-collection/{docId} { allow read: if auth.uid != null; // 读取仅校验auth.uid allow write: if auth.uid != null && request.resource.data.nickname != null; // 写入才校验request.resource.data }
2. 确保REST请求传递了正确格式的请求体
用Refit调用Firestore REST API时,写入操作必须在请求体里按Firestore要求的格式传递文档数据,否则Firestore不会生成request.resource对象。
- 正确定义Refit接口和数据模型:
请求体必须嵌套在[Post("/v1/projects/{projectId}/databases/(default)/documents/{collectionName}")] Task<ApiResponse<FirestoreDocument>> CreateDocument(string projectId, string collectionName, [Body] FirestoreDocumentData payload); public class FirestoreDocumentData { [JsonPropertyName("fields")] public Dictionary<string, FirestoreField> Fields { get; set; } } public class FirestoreField { [JsonPropertyName("stringValue")] public string StringValue { get; set; } // 按需添加integerValue、booleanValue等类型字段 }fields下,比如要传递nickname字段:{ "fields": { "nickname": { "stringValue": "test_user" } } }
3. 更新操作要同时传数据和更新掩码
如果是PATCH更新文档,Firestore REST要求同时指定updateMask和对应字段的数据,只传掩码不传数据会导致request.resource.data不完整或未定义。
- Refit接口示例:
调用时[Patch("/v1/projects/{projectId}/databases/(default)/documents/{collectionName}/{docId}?updateMask.fieldPaths={fieldPaths}")] Task<ApiResponse<FirestoreDocument>> UpdateDocument(string projectId, string collectionName, string docId, string fieldPaths, [Body] FirestoreDocumentData payload);fieldPaths传要更新的字段名(比如nickname),请求体里对应传入该字段的数据。
4. 规则中添加空值兼容(可选)
如果需要兼容部分无数据的写入场景,可以在规则里先判断request.resource.data是否存在:
allow write: if auth.uid != null && (request.resource.data == null || request.resource.data.nickname != null);
内容的提问来源于stack exchange,提问作者Nearon
相关产品推荐
相关产品推荐

