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

Firebase谷歌登录报错:Expected type 'Zu', but it was: a custom ea object

问题分析与解决办法

错误成因

这个FirebaseError: Expected type 'Zu', but it was: a custom ea object报错,大概率是以下两种情况导致:

  • Firestore路径构造错误:你调用collection()时传入了多余的斜杠/,Firebase的collection()方法只需要连续传递路径段参数,不需要手动加路径分隔符,多余的斜杠会让Firestore解析出错误的引用对象,触发类型不匹配报错。
  • SDK版本不兼容/重复导入:如果Auth和Firestore的SDK版本不一致,或者项目里重复引入了不同版本的Firebase包,会导致内部对象类型不兼容,出现这类类型错误。

解决步骤

1. 修复Firestore路径构造

把错误的路径写法改成正确格式,直接传递路径分段即可:

// 去掉多余斜杠,直接传递路径段
setDoc(collection(db, "users", userType, "users"), {
  userId: user.uid,
  firstName: user.displayName,
  lastName: user.displayName,
  contactNumber: user.phoneNumber,
  county: "",
  idNumber: "",
  city: "",
  zipCode: "",
  fullName: "",
  email: user.email,
  imageAsUrl: {
    imageAsUrl: user.photoURL,
  },
})

如果需要明确指定文档ID(比如用用户uid当文档ID),也可以用doc()配合collection():

const userDocRef = doc(db, "users", userType, "users", user.uid);
setDoc(userDocRef, { /* 用户数据 */ })

2. 统一Firebase SDK版本

  • 打开项目的package.json,检查所有firebase相关依赖的版本是否完全一致,比如:
    {
      "dependencies": {
        "firebase": "^10.7.0",
        // 拆分导入的话要保证版本统一:
        "@firebase/auth": "^10.7.0",
        "@firebase/firestore": "^10.7.0"
      }
    }
    
  • 执行npm install或yarn install重新安装依赖,确保版本统一。
  • 检查项目是否同时通过CDN和npm导入了Firebase SDK,如有,只保留一种导入方式。

3. 规范Provider初始化

确保GoogleAuthProvider从正确的Auth模块导入,且只初始化一次:

import { getAuth, GoogleAuthProvider, signInWithPopup } from "firebase/auth";
import { getFirestore, collection, setDoc } from "firebase/firestore";

const auth = getAuth();
const provider = new GoogleAuthProvider(); // 只初始化一次,避免重复创建
const db = getFirestore();

额外优化建议

你的代码里setDoc没有和外层async/await结合,建议改成try/catch包裹的写法,避免未捕获的异步错误:

export async function signUpGoogle(userType) {
  try {
    const result = await signInWithPopup(auth, provider);
    const credential = GoogleAuthProvider.credentialFromResult(result);
    const token = credential.accessToken;
    const user = result.user;

    // 修复后的Firestore写入
    const userDocRef = doc(db, "users", userType, "users", user.uid);
    await setDoc(userDocRef, {
      userId: user.uid,
      firstName: user.displayName.split(' ')[0] || user.displayName,
      lastName: user.displayName.split(' ').slice(1).join(' ') || '',
      contactNumber: user.phoneNumber || "",
      county: "",
      idNumber: "",
      city: "",
      zipCode: "",
      fullName: user.displayName,
      email: user.email,
      imageAsUrl: {
        imageAsUrl: user.photoURL,
      },
    });

    sessionStorage.setItem("Auth Token", token);
    return true;
  } catch (error) {
    const errorCode = error.code;
    const errorMessage = error.message;
    const email = error.email;
    const credential = GoogleAuthProvider.credentialFromError(error);
    console.log(errorCode, errorMessage);
    console.log(error);
    return false;
  }
}

内容的提问来源于stack exchange,提问作者NimrodMcTurner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:36:18