Firebase Auth回调报No document to update错误,第三方登录用户Firestore文档未创建
问题触发原因
- 你看到的
Unhandled Rejection (FirebaseError): No document to update错误是前端代码抛出,并非云函数侧报错。Cloud Functions的auth.user().onCreate触发器是异步执行的,前端完成Google/Facebook登录、拿到Auth用户信息时,云函数还没完成Firestore文档的写入操作。如果此时前端直接调用update()方法修改对应用户文档,就会因为目标文档尚未存在抛出该错误。 - 云函数的登录提供商判断逻辑存在隐患:直接使用
user.providerId判断登录方式是错误的,该属性目前对所有Firebase Auth用户统一返回firebase,无法正确区分登录方式,会导致你原本不需要创建文档的邮箱密码登录用户也会被写入Firestore。 - 你的云函数没有异常捕获逻辑,如果写入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
相关产品推荐
相关产品推荐

