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

Firebase 9 deleteDoc删除文档失败:Cannot read properties of null (reading 'name')

问题分析与解决方法

错误原因定位

你遇到的Uncaught TypeError: Cannot read properties of null (reading 'name')错误,并非来自删除用户文档的代码本身,而是删除用户文档的操作触发了应用内的实时数据监听回调,导致currentUserData被置为null,后续代码(大概率是组件渲染逻辑)尝试读取currentUserData.name时抛出错误。

注释掉删除用户文档的代码后,实时监听不会触发currentUserData的更新,因此错误消失——这也验证了这一点。

具体解决步骤

1. 提前缓存用户ID,避免重复依赖auth.currentUser

先把用户ID存到变量里,避免多次访问auth.currentUser可能出现的状态变化问题:

export const deleteUsersData = async (name) => {
  // 提前获取并缓存uid,避免后续auth状态变化导致的问题
  const currentUid = auth.currentUser?.uid;
  if (!currentUid) {
    throw new Error("用户未登录,无法执行删除操作");
  }

  await updateDoc(doc(colRefPn, "unames"), { names: arrayRemove(name) });
  await deleteDoc(doc(db, "players", currentUid, "collections", "robodata"));
  // 使用缓存的uid删除用户文档
  await deleteDoc(doc(db, "players", currentUid));

  try {
    await deleteUser(auth.currentUser);
  } catch {
    await reAuthenticateUser(); 
    await deleteUser(auth.currentUser);
  }
};

2. 处理实时监听的状态更新

如果你的应用通过onSnapshot等方式实时监听当前用户的players文档,删除文档后监听回调会把currentUserData设为null,此时需要:

  • 在删除操作前临时取消监听:比如把监听的 unsubscribe 函数存起来,执行删除前调用它取消监听,避免状态被更新为null;
  • 在组件中添加空值保护:所有用到currentUserData.name的地方,改用可选链操作符currentUserData?.name,避免直接访问null的属性:
    // 示例:组件中使用时的空值保护
    <div>{currentUserData?.name}</div>
    

3. 捕获完整错误栈定位问题

在调用deleteUsersData的catch块中打印完整错误对象,而不是只打印错误信息,这样能精准定位到抛出错误的代码行:

.catch((ex) => {
  Swal.fire("Could not delete!", "There was an error deleting the user.", "error");
  console.error("删除用户时出错:", ex); // 打印完整错误栈
});

额外注意事项

  • Firebase删除父文档不会自动删除子集合,你先删除子集合文档robodata再删父文档的逻辑是正确的;
  • deleteUser执行后用户会自动登出,后续的handleSignout可以考虑移除,避免重复操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:13:36