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

Angular+Firebase/Firestore 5.0.3:Google OAuth登录后文档自动删除问题

排查Firestore用户文档自动删除的问题

结合你提供的日志和代码,我帮你梳理几个最可能的原因和排查方向:

1. 优先检查Firestore安全规则

这是文档被自动删除最常见的原因。Firestore会在写入后验证规则,如果规则不允许该文档继续存在,就会触发删除操作。

你需要确认你的安全规则是否允许持久化保存用户文档:

  • 有没有给users/{userId}路径设置正确的write或update权限?比如如果只允许create而没有允许read/update,可能会导致写入后被拒绝删除。
  • 规则里是否强制要求文档包含某些字段,但你的set操作里没有提供?比如如果规则要求request.resource.data.createdAt必须存在,但你的代码里没添加这个字段,Firestore会拒绝写入并删除已创建的文档。

举个错误规则的例子:

match /users/{userId} {
  allow create: if request.auth.uid == userId;
  allow read: if request.auth.uid == userId;
  // 缺少了update/write权限,导致merge操作或后续文档存在不被允许
}

正确的规则应该覆盖完整的写入权限:

match /users/{userId} {
  allow read, write: if request.auth.uid == userId;
}

2. 检查代码中是否有重复/错误的删除逻辑

仔细排查你的代码流程:

  • 有没有其他地方监听了用户登录状态或users/{uid}文档的变化,触发了删除操作?比如某些订阅回调里不小心写了delete()方法?
  • 这段创建文档的代码是否被多次执行?有没有竞争条件导致一个请求创建文档,另一个请求误删?
  • 检查Angular组件的生命周期,比如是否在ngOnInit或其他钩子中重复触发了写入/删除逻辑?

3. 考虑旧版本Firestore的bug

你使用的Firestore 5.0.3是2018年的老版本,可能存在一些已知的兼容性或逻辑bug,比如merge: true参数的异常处理问题。如果前面的排查都没问题,可以尝试升级到与你的Angular版本兼容的较新Firebase版本(注意版本匹配,避免依赖冲突),再测试是否还会出现文档被删的情况。

4. 确认认证状态的稳定性

有没有可能在执行set操作时,用户的认证状态还未完全同步?比如虽然拿到了user对象,但Firestore的auth上下文还没就绪,导致写入后因权限验证失败被删除。

可以尝试将创建文档的逻辑放到authState的订阅中,确保用户完全认证后再执行:

this.auth.authState.subscribe(user => {
  if (user) {
    this.db.doc(`users/${user.uid}`).set({
      uid: user.uid,
      email: user.email,
      name: user.displayName,
      photoUrl: user.photoURL,
      roles: {}
    }, { merge: true });
  }
});

如果以上排查都没有解决问题,你可以提供以下信息帮助进一步定位:

  • 完整的Firestore安全规则
  • 登录到创建文档的完整代码流程(比如代码所在的组件/服务、触发时机)
  • 更多的Firestore日志(比如写入请求的响应日志,是否有明确的权限拒绝提示)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:19:53