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

Google登录创建用户档案问题:现有用户信息被更新,检查代码报错

问题分析与修复方案

你的代码存在两个核心问题,导致现有用户登录时信息被更新,同时出现异常:

  1. 提前获取未登录用户的UID:在调用signInWithPopup之前就尝试获取auth.currentUser.uid,此时用户还未完成登录,auth.currentUser为null,会导致id为undefined,后续基于此创建的userRef无效,触发getDoc异常。
  2. 错误的文档引用校验:即使侥幸获取到UID,也是登录前的旧用户(或空值),导致你校验的不是当前登录用户的数据库文档,最终错误执行setDoc覆盖原有数据。

修复后的代码

const signInWithGoogle = () => {
  signInWithPopup(auth, provider)
    .then(async (userCredential) => {
      try {
        // 从登录凭证中获取当前用户的UID,创建正确的文档引用
        const currentUserId = userCredential.user.uid;
        const userRef = doc(db, "users", currentUserId);
        
        const docSnap = await getDoc(userRef);
        if (!docSnap.exists()) {
          // 仅当用户档案不存在时才创建
          await setDoc(userRef, {
            // 从邮箱提取用户名(示例:取@前的部分)
            username: userCredential.user.email.split('@')[0],
            // 使用Google返回的头像URL,或自定义默认值
            profilePic: userCredential.user.photoURL || '默认头像地址'
          });
        }
      } catch (err) {
        console.error('登录/创建用户失败:', err);
        toast.error('登录失败,请重试');
        return; // 出错时不跳转
      }

      toast.success("登录成功");
      navigate("/dashboard");
    })
    .catch(err => {
      console.error('Google登录弹窗失败:', err);
      toast.error('登录失败,请重试');
    });
};

关键修改说明

  • 延迟获取用户UID:将用户文档引用的创建移到signInWithPopup的成功回调中,确保使用的是当前登录用户的有效UID。
  • 正确的存在性校验:基于当前登录用户的UID校验数据库文档,避免错误创建/覆盖。
  • 完善错误处理:增加signInWithPopup本身的错误捕获,出错时提示用户并终止流程,避免错误跳转。
  • 合理的字段赋值:直接使用Google登录返回的邮箱和头像URL,替代可能未定义的setUsername和profilePic变量(如果setUsername是自定义函数,可替换回setUsername(userCredential.user.email))。

内容的提问来源于stack exchange,提问作者A. Lawal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:03:27