Firebase Firestore v9报Uncaught TypeError n is undefined如何修复
问题根源
报错的核心原因是用户身份(user)还未初始化完成时,代码就触发了Firestore查询:
页面首次渲染时,全局状态中的user为undefined,此时调用collection(db, "users", user?.uid, "orders"),传入的路径段user?.uid为undefined,Firestore SDK不允许路径中存在undefined值,因此抛出类型错误。
后续Firebase Auth初始化完成,user被赋值为有效值,fetchData依赖user更新重新执行,所以后续查询成功,控制台能输出订单数据。
修复方案
在执行Firestore查询前,先判断user及其uid是否存在,不存在则直接终止逻辑,不发起查询。修改后的fetchData代码如下:
const fetchData = useCallback(async () => { // 核心修复:用户未登录/未初始化完成时直接返回,不发起查询 if (!user?.uid) { setOrders([]) return } console.log("User in orders: ", user); try { const myQuery = query( collection(db, "users", user.uid, "orders"), orderBy("created", "desc") ); const ordersSnapshot = await getDocs(myQuery); setOrders( ordersSnapshot.docs.map((doc) => ({ id: doc.id, data: doc.data(), })) ); } catch (error) { console.error("查询订单失败:", error) } }, [user]);
补充说明
- 这里去掉了路径里的可选链
user?.uid,因为前面已经做了非空判断,user.uid必然存在,不会传入非法值 - 保留try catch可以捕获其他潜在异常(比如权限不足、网络异常等),避免页面崩溃
- 不需要额外修改其他逻辑,当
user初始化完成后,useCallback会自动生成新的fetchData,useEffect触发重新执行即可正常拉取数据
内容的提问来源于stack exchange,提问作者Hello-World
相关产品推荐
相关产品推荐

