如何将状态数组上传至Firestore数组?解决arrayUnion参数错误
解决Firestore
FieldValue.arrayUnion() 传参错误的问题 这个错误提示很明确:arrayUnion() 必须至少传入一个参数,但你的代码在某些情况下(比如finalList是空数组时)会导致没有参数传入。咱们一步步来解决:
错误原因
你用了扩展运算符 ...finalList 来传递参数,当 finalList 是空数组时,展开后就没有任何参数,这就触发了Firestore的报错。哪怕你现在的playerID是[1,2,3],但如果后续这个数组变成空的,代码还是会出问题。
解决方案
先判断数组是否为空,再执行操作
在调用arrayUnion之前,先检查finalList有没有元素,避免空参数的情况:const dbh = firebase.firestore(); this.state = { playerID: [1,2,3], group: "your-group-id" }; var finalList = this.state.playerID; const docRef = dbh.collection("Groups").doc(this.state.group) .collection('Enrolled').doc('ids'); if (finalList.length > 0) { docRef.set({ players: firebase.firestore.FieldValue.arrayUnion(...finalList) }, { merge: true }); // 记得加*merge: true*,不然会覆盖文档里的其他字段! } else { // 数组为空时的处理,比如可以选择不修改,或者设置空数组 docRef.set({ players: [] }, { merge: true }); }这里要注意一定要加
{ merge: true },不然set()会直接替换整个文档,把其他可能存在的字段都删掉。如果你的需求是直接覆盖数组而非追加元素
如果你不需要去重追加,只是想把playerID数组直接存到Firestore里,那根本不需要用arrayUnion,直接传数组就行:docRef.set({ players: finalList }, { merge: true });封装一个安全的arrayUnion调用(可选)
如果经常需要处理这种情况,可以封装一个工具函数,自动处理空数组的情况:function safeArrayUnion(...elements) { if (elements.length === 0) { return firebase.firestore.FieldValue.arrayUnion(); // 或者返回一个空数组?根据需求调整 } return firebase.firestore.FieldValue.arrayUnion(...elements); } // 使用时 docRef.set({ players: safeArrayUnion(...finalList) }, { merge: true });
这样不管finalList是不是空数组,都不会触发报错啦。
内容的提问来源于stack exchange,提问作者kerim Erkan
相关产品推荐
相关产品推荐

