Firebase JS创建以用户ID为文档ID的文档报错求助
修复Firebase Auth注册后创建用户文档的错误
问题说明
我正在开发基于Firebase Authentication的注册系统,需要实现以下功能:
- 用户通过姓名、姓氏、邮箱和密码注册(使用
createUserWithEmailAndPassword()) - 注册成功后在“users”集合中创建文档,文档ID与注册用户的ID匹配
- 新文档包含用户输入的
name和surname字段
当前代码在创建文档环节抛出错误:Uncaught FirebaseError: Invalid document reference. Document references must have an even number of segments, but users has 1.,代码如下:
signupForm.addEventListener("submit",(e)=>{ e.preventDefault(); const name = signupForm.name.value; const surname = signupForm.surname.value; const email = signupForm.email.value; const password = signupForm.password.value; createUserWithEmailAndPassword(auth, email, password) .then(cred => { signupForm.reset(); userId = cred.user.uid; }) .catch(err => { console.log(err.message); }); setUserData(userId,name,surname); }); function setUserData(userId,name,surname){ const userRef = doc(db,"users",userId); setDoc(userRef,{ name: name, surname: surname }).then(() => { console.log("Document successfully written!"); }) .catch((error) => { console.error("Error writing document: ", error); }); }
错误原因
根本问题是异步执行顺序错误:createUserWithEmailAndPassword是异步操作,会在后台完成注册流程,但你在它的then回调之外调用了setUserData,这时候userId还没有被赋值(仍为undefined)。当setUserData接收undefined的userId时,doc(db,"users",userId)等价于doc(db,"users"),这会被Firebase识别为一个集合引用而非文档引用,而文档引用要求路径段数为偶数(格式为集合/文档,两段),因此触发了报错。
修复后的代码
把setUserData的调用移到createUserWithEmailAndPassword的then回调内部,确保只有在注册成功、userId被正确赋值后才执行文档创建操作:
signupForm.addEventListener("submit",(e)=>{ e.preventDefault(); const name = signupForm.name.value; const surname = signupForm.surname.value; const email = signupForm.email.value; const password = signupForm.password.value; createUserWithEmailAndPassword(auth, email, password) .then(cred => { signupForm.reset(); const userId = cred.user.uid; // 确保拿到userId后再调用创建文档的方法 setUserData(userId, name, surname); }) .catch(err => { console.log(err.message); }); }); function setUserData(userId,name,surname){ const userRef = doc(db,"users",userId); setDoc(userRef,{ name: name, surname: surname }).then(() => { console.log("Document successfully written!"); }) .catch((error) => { console.error("Error writing document: ", error); }); }
额外优化建议
- 用
const声明userId,避免全局变量污染 - 可根据需求将
setUserData的逻辑直接嵌入then回调,减少函数调用层级(可选)
内容的提问来源于stack exchange,提问作者Unity Enjoyer
相关产品推荐
相关产品推荐

