为何Firestore事务update操作未调用FirestoreDataConverter
原因说明
Firestore 客户端的 withConverter 转换器设计上仅作用于全量文档读写类操作,包括 add()、set()、get(),而 update()(包括普通文档更新和事务更新)属于部分字段补丁操作,不会触发转换器的 toFirestore 方法。
底层逻辑是:转换器的定位是对完整的实体对象做全量序列化/反序列化,而 update() 传入的是局部字段更新对象,并非完整的 Rabbit 类型实例,Firestore 不会将其视为实体对象走转换器流程,会直接校验字段值是否为 Firestore 支持的原生类型,你传入的 JS Map 属于自定义类型,不在 Firestore 原生支持的字段类型范围内,因此直接抛出类型错误。
解决方案
可以任选以下两种方式修复问题:
- 手动序列化更新字段:调用
update前自行把Map转为普通对象transaction.update(docRef, { map: Object.fromEntries(new Map()) }); - 改用事务的
set()方法配合合并参数,该操作会触发转换器逻辑// { merge: true } 表示只更新传入的字段,其余字段保留,和update行为一致 transaction.set(docRef, { map: new Map() }, { merge: true });
内容的提问来源于stack exchange,提问作者yN.
相关产品推荐
相关产品推荐

