调用admin.firestore.FieldValue.serverTimestamp()存储后为空对象问题
问题根因
你遇到的字段为空对象的问题和add方法无关,核心问题出在写入Firestore前的序列化操作:JSON.parse(JSON.stringify(message))。admin.firestore.FieldValue.serverTimestamp()返回的是Firebase SDK内置的特殊标记对象,不属于JSON标准支持的类型,经过JSON.stringify序列化时会被直接转换为空对象{},后续再反序列化拿到的就已经是无效的空值,自然无法被Firestore识别为服务端时间戳标记,最终就会出现你截图里存储为空对象的情况。
你当前使用的firebase-admin v8.10.0版本完全支持add方法传入serverTimestamp标记,不需要额外升级版本,也不需要换用set/create方法。
解决方案
你可以根据自己的业务场景选择以下任意一种方案修复:
- 方案1:删除序列化反序列化逻辑,直接传入实例对象
如果你的TextMessage实例没有包含无法被Firestore识别的自定义属性,直接把add方法的入参改成原始的message对象即可,代码修改如下:
const createChatPromise = firestoreDB .collection("Chats") .doc(chatID) .collection("Messages") .add(message)
- 方案2:序列化前单独提取时间戳标记,序列化后再回填
如果你的业务逻辑确实需要先做序列化操作(比如需要先处理字段、过滤敏感信息等),可以先把createdAt字段单独存起来,序列化完成后再把原始的时间戳标记回填回去:
const createdAt = message.createdAt const serializedMsg = JSON.parse(JSON.stringify(message)) serializedMsg.createdAt = createdAt const createChatPromise = firestoreDB .collection("Chats") .doc(chatID) .collection("Messages") .add(serializedMsg)
- 方案3:为类定义
toJSON方法控制序列化行为
你可以在Message基类或者TextMessage子类中实现自定义toJSON方法,序列化时自动排除特殊的FieldValue类型字段,后续再手动回填即可。
内容的提问来源于stack exchange,提问作者Andrey Solera
相关产品推荐
相关产品推荐

