You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:48:34