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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:45:04