Firestore创建子集合时出现indexOf未定义错误求助
问题解决:Firestore创建子集合时报错TypeError: Cannot read properties of undefined (reading 'indexOf')
问题根源
你的createProject函数里,addDoc是异步操作,返回的是Promise对象,而非直接的DocumentReference。你直接访问projectRef.uid时,Promise没有这个属性,导致DocRef创建时传入了undefined,后续调用collection(DocRef,"team")时,因为无效的文档引用触发了indexOf相关的错误。另外,Firestore文档的ID属性是id,不是uid(uid是用户认证ID)。
修复步骤
- 将
createProject改为异步函数,用await获取addDoc返回的真实DocumentReference。 - 使用文档引用的
id属性来构建子集合的父文档引用。 - 异步操作建议都加上
await,保证执行顺序和错误捕获。
修改后的代码
AuthContext.js中修改createProject函数
async function createProject(projectName) { // 等待addDoc完成,获取真实的文档引用 const projectRef = await addDoc(collection(db, projectsCollection), { "name": projectName }); // 使用文档的id属性构建父文档引用 const DocRef = doc(db, projectsCollection , projectRef.id); // 创建team子集合文档 await addDoc(collection(DocRef,"team"), { "email": "hey@gmail.com" }); // 创建tasks子集合文档 await addDoc(collection(DocRef,"tasks"), { "title": "lets go do something", "status": "doing", "assignedTo": "hey@gmail.com" }); }
ProjectAssign.js中调用时加上await
const handleCreateProject = async () => { try { await createProject(projectName); // 可添加创建成功后的逻辑,比如跳转页面 Router.push("/UserDashboard"); } catch (error) { console.error("创建项目失败:", error); } }
额外说明
- Firestore的异步操作(如
addDoc、setDoc)都返回Promise,必须通过await或.then()才能获取结果。 - 文档引用的ID是
id属性,用户的认证ID才是uid,不要混淆两者。 - 加上
await后,错误可以被try/catch捕获,方便排查问题。
内容的提问来源于stack exchange,提问作者André Gomes
相关产品推荐
相关产品推荐

