首页 > 解决方案 > FieldValue.serverTimestamp() 是否添加其他数据?

问题描述

我有以下功能

  Future<void> _updateDocument(String path, {Map<String, dynamic> data}) async {
    final Map<String, dynamic> stampedData = {'updatedAt': FieldValue.serverTimestamp()};
    if (data != null) stampedData.addAll(data);
    try {
      print('Updating document : $path with $stampedData');
      final DocumentReference documentReference = _fireStore.document(path);
      await documentReference.updateData(stampedData);
    } on PlatformException catch (error) {
      throw UserFriendlyException('Operation Failed', error.message);
    }
  }

哪个更新了某个文档。但我不断收到以下错误

组/YUUjiGgQ6De4IMshWmRF 写入失败:状态{code=PERMISSION_DENIED,描述=缺少或权限不足。,原因=null}

因为我有以下规则

incomingData().keys().hasOnly(['updatedAt', 'displayName']) == true

所以我测试了实际有多少个键,结果发现有 5 个键

function isValidGroupRename(){
    return incomingData().keys().hasAll(['updatedAt', 'displayName']) == true &&
             incomingData().keys().size() < 6
}

因为这个函数通过了测试但< 5没有通过。当我在调用更新之前查看数据对象时,这行print('Updating document : $path with $stampedData');告诉我我只更新了 2 个值

Updating document : groups/YUUjiGgQ6De4IMshWmRF with {updatedAt: FieldValue(Instance of 'MethodChannelFieldValue'), displayName: jjjjjgi}

那么 FieldValue.serverTimestamp() 是否添加了字段?如果是这样,这些字段是什么,所以我可以检查它们。

标签: dartgoogle-cloud-firestore

解决方案


当它达到您的安全规则时,FieldValue.serverTimestamp()已转换为正常的日期和时间值。没有额外的数据被写入。

然而,一个常见的错误是期望request.resource它只包含从客户端写入的数据。它实际上包含操作完成后将存在的数据(如果成功)。

因此,如果文档中有 5 个字段,并且您要更新其中的 2 个:request.resource将包含 5 个字段,其中 2 个已更新。

另见:


推荐阅读