Firebase Functions+Firestore事务中ignoreUndefinedProperties配置不生效问题
原因说明
- 你配置的
ignoreUndefinedProperties属于Firestore根实例的全局参数,旧版本Firebase Admin SDK中,事务执行时创建的transaction实例不会继承该全局配置,因此内部的update操作仍会校验字段值,遇到undefined就会抛出错误。 - 注意Firestore本身原生支持存储
null值,只有字段值为undefined时才会触发校验报错,你提到的移除null后操作成功,大概率是你的可空字段在逻辑运行中被实际赋值为undefined而非null。
解决方案
方案1:手动过滤对象中的undefined值(最稳妥,全版本兼容)
写个工具函数预处理要写入的data,去掉所有值为undefined的字段后再传入transaction.update:
// 单层对象过滤undefined const filterUndefined = (obj) => { return Object.fromEntries( Object.entries(obj).filter(([_, value]) => value !== undefined) ) } // 事务内使用 admin.firestore().runTransaction(async (transaction) => { const docRef = admin.firestore().doc(`${path}/${id}`); // 先处理数据再更新 const processedData = filterUndefined(data); transaction.update(docRef, processedData); });
如果有嵌套对象,把工具函数改为递归过滤即可。
方案2:升级Firebase Admin SDK到最新版本
该事务不继承全局ignoreUndefinedProperties的问题属于历史bug,在v10+以上的Admin SDK版本中已经修复,直接升级依赖即可:
npm install firebase-admin@latest
方案3:统一替换undefined为null(需要保留空值存储时用)
如果你需要在数据库中保留空值标识,统一把字段的undefined替换为Firestore支持的null类型即可:
const replaceUndefinedWithNull = (obj) => { return Object.fromEntries( Object.entries(obj).map(([key, value]) => [key, value === undefined ? null : value]) ) } // 事务内使用 transaction.update(docRef, replaceUndefinedWithNull(data));
内容的提问来源于stack exchange,提问作者Bokris Itzhak
相关产品推荐
相关产品推荐

