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

