如何解决向Firebase新创建文档添加子集合时生成新文档的问题?
问题原因与解决方案
核心问题
你的代码报错的核心原因是 Firebase Auth用户ID字段调用错误:
Firebase Auth返回的auth.currentUser对象的唯一标识字段为uid,而非id。你代码中传入的auth.currentUser.id实际取值为undefined,当Firestore的doc()方法接收undefined作为参数时,会自动生成随机ID作为文档ID,这就是你看到生成新随机ID文档的原因。
优化修正
除了修正字段错误,你还可以简化文档引用逻辑:已经获取到新创建chat文档的docRef后,可直接基于该引用创建子集合,无需重复拼接db.collection("chats").doc(docRef.id)路径。同时建议对异步写入操作增加等待与错误捕获逻辑,避免时序问题。
修正后的代码示例:
db.collection('chats').add({ created: firebase.firestore.FieldValue.serverTimestamp() }) .then(async (docRef) => { console.log("新生成的chat id:" + docRef.id) // 直接基于现有docRef构造参与者子集合引用 const participantsCol = docRef.collection("participants") // 并行写入两个参与者信息,用Promise.all统一管理异步任务 await Promise.all([ // 把id改为uid participantsCol.doc(auth.currentUser.uid).set(currentUser), participantsCol.doc(user.id).set(otherUser) ]) // 依赖写入完成的后续操作可写在此处 }) .catch(err => { // 增加错误捕获方便排查问题 console.error("参与者信息写入失败:", err) })
验证步骤
- 写入前打印
auth.currentUser.uid确认可以拿到正确的用户ID字符串,避免传入空值触发自动生成ID逻辑 - 写入完成后在Firestore控制台核对对应chat文档下的participants子集合,确认文档ID与预期一致
内容的提问来源于stack exchange,提问作者bobby_belfast
相关产品推荐
相关产品推荐

