将Firestore文档存入变量后丢失引用的问题排查
问题:Firestore文档引用跨函数复用出现随机类型不匹配错误
场景与实现逻辑
我需要从Firebase获取用户文档并设为全局变量,方便在多个函数中复用。其中displaySavedPlaces()函数要获取用户收藏的所有"places"文档列表,这些收藏以文档引用数组的形式存在Firestore的用户文档中。
我在onAuthStateChanged()回调里完成全局变量的赋值:获取当前用户uid对应的文档,存入currentUser变量,同时保存用户uid和文档引用供后续调用:
let authChangeListeners = []; export function onAuthChange(listener) { authChangeListeners.push(listener); } window.currentUser = null; onAuthStateChanged(auth, async (userFirebase) => { // Si user firebase, on remplit user de la db if (userFirebase) { const userRef = doc(db, "users", userFirebase.uid); const userDoc = await getDoc(userRef); const userData = userDoc.data(); currentUser = { uid: userDoc.id, ...userData, ref: userRef }; const avatarRef = ref(avatarsImageRef, currentUser.customAvatar ?? "default-av.webp"); currentUser.avatarUrl = await getDownloadURL(avatarRef); } authChangeListeners.forEach((listener) => { return listener(currentUser); }); });
触发的错误
调用displaySavedPlaces函数时,Firebase会抛出随机错误(触发概率约2/3),错误来自getDoc()函数:
Type does not match the expected instance. Did you pass a reference from a different Firestore SDK?
调用displaySavedPlaces的代码如下:
import { onAuthChange } from "./assets/javascripts/main"; onAuthChange(async (user) => { if (user) { displaySavedPlaces(user); } else { } }); async function displaySavedPlaces(user) { elements.savedPlacesContainer.innerHTML = ""; user.savedPlaces.forEach(async (elem) => { console.log(elem); const placeSnapshot = await getDoc(elem); const place = placeSnapshot.data(); ... }); }
调试发现
无论是否报错,console.log(elem)都能显示结构正常的文档引用对象。但如果把收藏的places存入currentUser以外的变量,就不会出现问题;甚至直接执行currentUser = userData也会触发错误,说明引用在赋值给currentUser的过程中出现了异常。请问这是什么原因?
内容的提问来源于stack exchange,提问作者Floran
相关产品推荐
相关产品推荐

