如何在TypeScript版Firebase云函数中用arrayUnion追加字符串数组
解决Firebase Cloud Functions中arrayUnion追加数组元素及数组长度undefined问题
问题1:arrayUnion将整个数组作为单个元素添加
admin.firestore.FieldValue.arrayUnion()接受的是可变数量的单个元素参数,而非直接传入数组。你直接传入items数组时,Firestore会把整个数组当作一个独立元素存入wishlistedItems数组中,导致不符合预期的嵌套结构。
解决方法:使用ES6扩展运算符...将items数组的元素逐个展开,作为arrayUnion的参数,这样每个字符串会被单独追加到目标数组中,同时Firestore的arrayUnion会自动忽略已存在的元素,满足你无重复ID的需求。
问题2:items数组长度显示undefined
控制台显示items.length为undefined,说明调用addItemsToWishlist时传入的items可能不是数组类型(比如传入了null、undefined或者对象、字符串等非数组值),导致无法读取length属性。
解决方法:在函数开头添加数组类型校验,确保items是数组后再处理空数组逻辑。
修改后的完整代码
//Defined in class constructor private firestore: FirebaseFirestore.Firestore async addItemsToWishlist(uid: string, items: string[]): Promise<boolean> { try { // 先校验是否为数组,非数组或空数组直接返回 if (!Array.isArray(items) || items.length === 0) { return true; } console.log("Called Successfull with items: ", items); console.log("items length: ", items.length); // 展开数组元素,逐个追加到wishlistedItems await this.firestore.collection("users").doc(uid).update({ wishlistedItems: admin.firestore.FieldValue.arrayUnion(...items), }); return true; } catch (e) { console.error(e); return false; } }
关键修改说明
- 新增
Array.isArray(items)校验:确保传入的items是数组类型,避免因非数组值导致length读取失败。 - 使用
arrayUnion(...items):通过扩展运算符将数组元素展开,实现逐个追加,同时利用Firestore内置的去重特性,保证wishlistedItems中无重复ID。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

