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
相关产品推荐
相关产品推荐

