React组件调用Firebase异步方法无响应,谷歌登录后无法执行数据库操作
Firebase谷歌登录后createUserDocumentFromAuth无响应问题修复
问题根源
signInWithGooglePopup()返回的是UserCredential对象,不是直接的用户实例。你直接把这个对象传给createUserDocumentFromAuth,访问userAuth.uid时会出现异常;再加上异步方法没加错误捕获,导致错误被静默吞掉,看起来方法完全没执行。
修复代码
1. 修改sign-in.component.jsx中的登录逻辑
const logGoogleUser = async () => { try { // 从UserCredential中取出实际的user对象 const { user } = await signInWithGooglePopup(); // 调用时加上await,确保异步方法执行完成 await createUserDocumentFromAuth(user); } catch (error) { // 捕获并打印错误,方便排查 console.error('操作失败:', error); } }
2. 可选:完善createUserDocumentFromAuth方法(添加文档存在性检查)
如果需要仅创建不存在的用户文档,可以补充逻辑:
import { getDoc, setDoc } from 'firebase/firestore'; // 新增导入 export const createUserDocumentFromAuth = async (userAuth) => { if (!userAuth) return; const userDocRef = doc(db, 'users', userAuth.uid); console.log(userDocRef); // 检查文档是否存在,不存在则创建 const userSnapshot = await getDoc(userDocRef); if (!userSnapshot.exists()) { const { displayName, email } = userAuth; const createdAt = new Date(); try { await setDoc(userDocRef, { displayName, email, createdAt }); } catch (error) { console.error('创建用户文档失败:', error); } } return userDocRef; }
关键说明
- 必须从
UserCredential中解构出user属性,才能拿到包含uid的有效用户实例 - 异步方法调用时要加
await,并通过try/catch捕获错误,避免静默失败 - 补充文档存在性检查可以避免重复创建相同用户的文档
内容的提问来源于stack exchange,提问作者user2049142
相关产品推荐
相关产品推荐

