Google Cloud Function更新Firestore时如何正确忽略undefined值
报错核心原因
ignoreUndefinedProperties是Firestore实例级的全局配置,不属于set()、update()这类写入方法的合法入参,你写在set()第二个参数里的同名配置不会被识别,属于无效代码。- 你在index.js中配置的Firestore实例没有被业务文件复用:如果业务逻辑文件里单独调用
admin.firestore()生成新的Firestore实例,新实例不会继承其他实例的settings配置,自然不会自动忽略undefined值。
正确实现方法
- 统一初始化全局Firestore实例并配置规则
确保db.settings()在所有Firestore读写操作之前执行,配置完成后导出实例供全项目复用,index.js代码调整如下:const admin = require('firebase-admin'); admin.initializeApp(); const db = admin.firestore(); // 必须在实例发起任何读写请求前调用settings配置 db.settings({ ignoreUndefinedProperties: true }); // 导出配置完成的实例 module.exports = { db }; - 业务文件复用已配置的实例,禁止重复初始化
业务逻辑文件中不要自行调用admin.firestore()创建新实例,所有文档引用都从统一导出的db实例生成,业务代码调整示例:const functions = require('firebase-functions'); const {Client, ReverseGeocodingLocationType, AddressType} = require("@googlemaps/google-maps-services-js"); // 引入已配置好规则的db实例,引入路径按实际项目结构调整 const { db } = require('./index'); async function addLocationData(addressComponents, reference){ // 注意:传入的reference必须通过上述引入的db实例创建,示例创建方式: // const reference = db.collection('目标集合名').doc('目标文档id'); const cityName = getLocationType(addressComponents, 'locality') const stateName = getLocationType(addressComponents, 'administrative_area_level_1') const countryName = getLocationType(addressComponents, 'country') // 写入时不需要在options中传入ignoreUndefinedProperties,该配置全局生效 await reference.set({ 'location.city': cityName, 'location.state': stateName, 'location.country': countryName }, { merge: true }) // 若需求为更新已有文档而非全量覆盖则保留merge,可按需调整 return true } - 避坑提示:不要在执行
db.settings()之前用对应实例发起任何Firestore请求,否则会导致配置失效,部分SDK版本还会抛出重复配置的异常。
内容的提问来源于stack exchange,提问作者TrotterDown
相关产品推荐
相关产品推荐

