Firestore使用变量更新文档报错:TypeError: o.indexOf is not a function
问题分析与解决方案
错误原因
你遇到的TypeError: o.indexOf is not a function,本质是传入doc()方法的secureDocid不是字符串类型。Firestore的doc()方法要求文档ID必须是字符串,当你传入非字符串(比如对象、数字或其他类型)时,内部逻辑调用indexOf方法就会触发这个错误——因为只有字符串才有indexOf方法。
直接传硬编码的字符串ID能正常运行,也验证了这一点:只有字符串类型的ID才符合Firestore的要求。
修复步骤
1. 确保secureDocid是字符串类型
在函数开头添加类型转换或校验,强制将参数转为字符串:
function toggleOlustur(secureDocid) { // 强制转为字符串,避免非字符串类型传入 secureDocid = String(secureDocid); const db = firebase.firestore(); // ... 后续代码 }
2. 优化查询逻辑(可选但推荐)
你当前的代码先查询整个securecollection集合再遍历匹配文档ID,这完全没必要——既然已经知道目标文档的ID,直接通过doc(secureDocid).get()获取单个文档即可,大幅提升性能:
function toggleOlustur(secureDocid) { // 强制转为字符串 secureDocid = String(secureDocid); const db = firebase.firestore(); // 直接获取目标文档,无需遍历全集合 db.collection("securecollection").doc(secureDocid).get() .then(doc => { if (doc.exists) { db.collection("publiccollection").add({ oad: doc.data().oad, osad: doc.data().osad, opuan: doc.data().opuan, odtarih: doc.data().odtarih, odurum: "1", }) .then((docRef) => { db.collection('securecollection').doc(secureDocid).update({ preference: docRef.id }); }); } else { console.log("目标文档不存在"); } }) .catch(err => { console.error("获取文档失败:", err); }); }
额外提醒
- 检查调用
toggleOlustur的地方,确保传入的参数确实是文档ID字符串(比如从文档快照的doc.id获取,而不是传入整个快照对象)。 - 可以添加参数校验,避免无效输入:
if (typeof secureDocid !== 'string' || secureDocid.trim() === '') { console.error("无效的文档ID"); return; }
内容的提问来源于stack exchange,提问作者Barış Üner
相关产品推荐
相关产品推荐

