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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:51:02