Google登录创建用户档案问题:现有用户信息被更新,检查代码报错
问题分析与修复方案
你的代码存在两个核心问题,导致现有用户登录时信息被更新,同时出现异常:
- 提前获取未登录用户的UID:在调用
signInWithPopup之前就尝试获取auth.currentUser.uid,此时用户还未完成登录,auth.currentUser为null,会导致id为undefined,后续基于此创建的userRef无效,触发getDoc异常。 - 错误的文档引用校验:即使侥幸获取到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
相关产品推荐
相关产品推荐

