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

Firebase Firestore异步操作报错:预期类型'th',实际为自定义nh对象

解决Firebase Firestore的"Expected type 'th', but it was: a custom nh object"错误

问题原因

你代码里的第三个操作存在关键错误:totalEnrolledRef是通过collection()创建的集合引用,但setDoc()方法要求第一个参数必须是文档引用,传入集合引用就会触发这个类型不匹配的报错。

修正方案

给enrolled_list集合指定具体的文档ID(比如用用户的uid作为文档ID),创建合法的文档引用后再调用setDoc():

修正后的完整代码

const handleGiveAccess = async (uid, courseId) => {
        const reqDocRef = doc(db, `users/${uid}/sent_requests/${uid}_${courseId}`);
        updateDoc(reqDocRef, { enrollmentStatus: "resolved" })
          .then(() => {
            toast.success("Added to Resolved List! Refresh to see changes");
            console.log("Document successfully updated!");
          })
          .catch((error) => {
            console.error("Error updating document: ", error);
          });
    
        const requestsDocs = doc(db, `requests/${uid}_${courseId}`);
        updateDoc(requestsDocs, { enrollmentStatus: "resolved" })
          .then(() => {
            console.log("Enrollment status updated in requests collection!");
          })
          .catch((error) => {
            console.error("Error updating document: ", error);
          });
    
        const courseRef = doc(db, "courses", courseId);
        const totalEnrolledCollectionRef = collection(courseRef, "enrolled_list");
        // 创建文档引用,用uid作为文档ID
        const totalEnrolledDocRef = doc(totalEnrolledCollectionRef, uid);
    
        const data = {
          uid,
        };
    
        setDoc(totalEnrolledDocRef, data)
          .then(() => {
            console.log("Document successfully written!");
          })
          .catch((error) => {
            console.error("Error writing document: ", error);
          });
};

额外优化建议

因为函数声明了async,可以改用await替代then/catch,让代码逻辑更线性清晰:

const handleGiveAccess = async (uid, courseId) => {
  try {
    // 更新用户请求文档
    const reqDocRef = doc(db, `users/${uid}/sent_requests/${uid}_${courseId}`);
    await updateDoc(reqDocRef, { enrollmentStatus: "resolved" });
    toast.success("Added to Resolved List! Refresh to see changes");
    console.log("Document successfully updated!");

    // 更新请求集合文档
    const requestsDocs = doc(db, `requests/${uid}_${courseId}`);
    await updateDoc(requestsDocs, { enrollmentStatus: "resolved" });
    console.log("Enrollment status updated in requests collection!");

    // 添加到已报名列表
    const courseRef = doc(db, "courses", courseId);
    const totalEnrolledCollectionRef = collection(courseRef, "enrolled_list");
    const totalEnrolledDocRef = doc(totalEnrolledCollectionRef, uid);
    await setDoc(totalEnrolledDocRef, { uid });
    console.log("Document successfully written!");
  } catch (error) {
    console.error("操作失败: ", error);
  }
};

内容的提问来源于stack exchange,提问作者Mahmudul Ahsan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:02:54