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
相关产品推荐
相关产品推荐

