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

react-native-firebase 同时删除Auth与Firestore用户数据方案

问题根因

你遇到的两个问题本质是代码逻辑顺序、变量引用、异步处理三个层面的错误导致的:

  • 执行顺序颠倒:你先执行了Auth账号删除,这个操作完成后当前登录会话会立刻被销毁,auth().currentUser会直接被置为null,后续再取uid自然会报null错误;同时如果你的Firestore配置了身份校验规则,Auth删除后请求令牌失效,根本没有权限操作Firestore,文档当然删不掉。
  • 变量引用错误:Firestore删除逻辑里写的user.uid没有对应作用域变量,你从Context解构时把用户对象赋值给了_占位符,全局根本没有定义user变量,本身就会触发引用错误。
  • 异步逻辑混乱:混用async/await和then链式调用,没有等待Firestore删除操作执行完成就走后续逻辑,很容易因为上下文销毁导致操作中断。
  • 顶层取值风险:在组件渲染顶层直接取auth().currentUser.uid存常量,Auth状态是异步初始化的,如果渲染时Auth还没完成初始化、或者中途用户状态变化,这个值要么直接报错,要么是过期值。
修正后代码

核心调整逻辑:提前缓存当前用户uid → 先删Firestore文档 → 再删Auth账号 → 最后更新全局状态,所有异步操作串行等待,统一错误捕获。

const [_, setUser] = useContext(UserContext);

const deleteUserFunc = async () => {
  try {
    // 前置校验+缓存当前用户信息,避免后续状态变化取不到值
    const currentUser = auth().currentUser;
    if (!currentUser) {
      throw new Error("当前无有效登录状态,无法删除账号");
    }
    const uid = currentUser.uid;

    // 先删Firestore对应用户文档(必须在Auth删除前执行,否则身份令牌失效会无权限)
    await db.collection('users').doc(uid).delete();

    // Firestore操作成功后再删除Auth侧账号
    await currentUser.delete();

    // 所有删除操作完成后,更新全局登录状态
    setUser(state => ({ ...state, isLoggedIn: false }));
  } catch (err) {
    // 统一捕获全流程错误,可在这里加用户提示
    console.log("账号删除失败:", err);
  }
}
优化建议
  • 可靠性兜底:如果要避免客户端操作中途中断(比如删完Firestore后APP闪退、网络中断导致Auth没删成,或者反过来),可以搭配Firebase Auth的服务端触发器,监听用户删除事件,在服务端自动清理对应Firestore文档,从根源避免脏数据。
  • 状态监听优化:不要在组件顶层硬取currentUser值,建议用onAuthStateChanged监听Auth状态变化,同步更新Context里的用户信息,所有用到用户uid的地方优先从Context取,避免直接调用auth().currentUser拿瞬时值导致的null问题。
  • 权限校验:如果你的Firestore安全规则限制用户只能删除自己的文档,严格保持「先删Firestore,后删Auth」的顺序,调换顺序会直接返回权限不足错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:33:22