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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 09:15:04