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

Firebase Auth回调报No document to update错误,第三方登录用户Firestore文档未创建

问题触发原因

  1. 你看到的Unhandled Rejection (FirebaseError): No document to update错误是前端代码抛出,并非云函数侧报错。Cloud Functions的auth.user().onCreate触发器是异步执行的,前端完成Google/Facebook登录、拿到Auth用户信息时,云函数还没完成Firestore文档的写入操作。如果此时前端直接调用update()方法修改对应用户文档,就会因为目标文档尚未存在抛出该错误。
  2. 云函数的登录提供商判断逻辑存在隐患:直接使用user.providerId判断登录方式是错误的,该属性目前对所有Firebase Auth用户统一返回firebase,无法正确区分登录方式,会导致你原本不需要创建文档的邮箱密码登录用户也会被写入Firestore。
  3. 你的云函数没有异常捕获逻辑,如果写入Firestore时出现权限、字段格式等问题,错误会被静默吞掉,无法在日志中排查。

解决方法

1. 修复前端时序问题

不要在登录完成后直接调用update()操作用户文档,二选一即可:

  • 方案一:前端改用set()方法配合{ merge: true }参数,文档不存在时自动创建,存在时合并更新字段,示例:
await db.collection('users').doc(当前登录用户uid).set({
  // 需要更新的字段
}, { merge: true })
  • 方案二:前端登录后先监听对应用户文档的创建事件,等文档生成后再执行后续更新操作。

2. 优化云函数逻辑

修正提供商判断规则,添加异常捕获便于排查问题:

exports.onUserCreate = functions.auth.user().onCreate(async (user) => {
  // 仅非邮箱密码登录的用户才创建文档
  const isPasswordLogin = user.providerData.some(provider => provider.providerId === 'password')
  if (isPasswordLogin) return

  try {
    console.log('开始创建用户文档', user.uid)
    await admin.firestore().collection('users').doc(user.uid).set({
      email: user.email,
      photoURL: user.photoURL,
      user_name: '',
      full_name: user.displayName,
      phone_number: '',
      uid: user.uid,
      friends_count: 0,
      posts: 0,
      fcm_token: '',
      chats_initiated: [],
      rank: 'Goon',
      rah_points: 0,
      last_seen: '',
      push_notification_settings: 'ON',
    })
    console.log('用户文档创建成功', user.uid)
  } catch (err) {
    console.error('用户文档创建失败', err)
    throw err
  }
})

3. 额外排查项

如果调整后文档仍未生成,检查两个配置:

  • 确认云函数部署的区域和Firestore数据库所在区域一致,避免跨区域访问异常
  • 确认云函数默认服务账号未被修改权限,默认的Cloud Functions Service Agent角色已经包含Firestore写入权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:09:00