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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:24:03