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

