Firebase Function带Converter执行Set(merge:true)清空Document Reference问题
问题根源
你遇到的organization字段被意外设为null的核心原因是UserConverter的toFirestore方法逻辑问题:当你传入部分User属性执行set操作时,缺失的organization字段为undefined,现有代码会将所有非真值的organization都转换为null,哪怕你开启了ignoreUndefinedProperties也不会过滤值为null的字段,因此会覆盖原有文档的organization值。
解决方案
修改UserConverter的toFirestore方法,明确区分undefined和null两种情况:仅当显式传入organization: null时才返回null,若字段为undefined则返回undefined,让ignoreUndefinedProperties配置自动过滤未传入的字段,不会覆盖原有值。
修改后的toFirestore代码如下:
toFirestore(user: Partial<User>): firestore.DocumentData { return { email: user.email, name: user.name, // 区分undefined和null,仅显式传null时才返回null organization: user.organization === undefined ? undefined : (user.organization ? user.organization.reference : null), number_of_forwards: user.numberOfForwards, last_forward_reset: user.lastForwardReset?.toDate() } }
同时建议将toFirestore的入参类型修改为Partial<User>,适配部分更新的场景,保证类型校验正常工作。
验证效果
修改后你原有定时函数的代码无需改动,调用带merge: true的set方法时:
- 仅会更新你显式传入的
numberOfForwards和lastForwardReset两个字段 - 自动复用Converter内置的moment转Date逻辑
- 保留完整的类型支持
- 不会覆盖用户文档的其他字段,也不存在并发写入冲突问题
内容的提问来源于stack exchange,提问作者Norbert Hüthmayr
相关产品推荐
相关产品推荐

