dart - 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() 是否添加了字段?如果是这样,这些字段是什么,所以我可以检查它们。
解决方案
当它达到您的安全规则时,FieldValue.serverTimestamp()
已转换为正常的日期和时间值。没有额外的数据被写入。
然而,一个常见的错误是期望request.resource
它只包含从客户端写入的数据。它实际上包含操作完成后将存在的数据(如果成功)。
因此,如果文档中有 5 个字段,并且您要更新其中的 2 个:request.resource
将包含 5 个字段,其中 2 个已更新。
另见:
推荐阅读
- go - can someone explain to me this golang data race behaviour?
- python - 在为 pdftotext 构建轮子时,命令“gcc”失败,退出状态为 1
- java - 使用 ProcessBuilder 在我的 Android 应用程序中启动服务,但它仅以“su”(root)开头
- arduino - 基于 ublox 7 的 GPS 模块 - 大部分时间从 Arduino 板上的 UART 引脚检索数据不完整/数据格式不正确
- google-apps-script - Google sheet onOpen() 触发器不会在移动浏览器或移动应用程序上触发
- google-chrome - Chrome devtools 不显示所有控制台错误
- typescript - 我如何告诉打字稿元组中的最后一个参数始终是一个函数?
- javascript - 滚动页面 selenium webdriver JS
- mdriven - MDriven中的继承规则?
- swift - 创建会话管理器以快速了解超时