You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:45:21