React+Firebase 如何实现Google OAuth首次登录时仅创建一次Firestore文档
解决方案
你当前的问题核心是Google登录逻辑没有区分新老用户,不管用户是不是首次登录都会执行setDoc操作,就算加了merge: true参数,也会强制把myList字段覆盖为空数组,导致每次登录都会清空原有数据。
Firebase的signInWithPopup返回的用户凭据中自带additionalUserInfo.isNewUser字段,可以直接用来判断是否为首次注册的新用户,仅当用户是首次注册时才执行初始化文档的逻辑即可,修改后的代码如下:
function googleAuth(provider) { return firebase .auth() .signInWithPopup(provider) .then(async function createUserDb(userCredentials) { // 仅首次注册的新用户才初始化用户文档 if (userCredentials.additionalUserInfo.isNewUser) { await setDoc(doc(db, "users", userCredentials.user.uid), {myList: []}) } }) }
如果需要兼容历史已登录过、但没有生成对应Firestore文档的老用户,可以用更稳妥的文档存在性判断方案:
import { getDoc } from "firebase/firestore"; // 需提前导入getDoc方法 function googleAuth(provider) { return firebase .auth() .signInWithPopup(provider) .then(async function createUserDb(userCredentials) { const userDocRef = doc(db, "users", userCredentials.user.uid); const userDocSnapshot = await getDoc(userDocRef); // 仅当用户文档不存在时才执行初始化 if (!userDocSnapshot.exists()) { await setDoc(userDocRef, {myList: []}) } }) }
内容的提问来源于stack exchange,提问作者DEV MEENA
相关产品推荐
相关产品推荐

