Firestore中如何获取新注册用户UID并将其设为用户集合文档名?
问题根因
你目前遇到的拿不到新注册用户UID、没法将users集合文档名改为UID的问题,本质是两个实现层面的疏漏导致的:
- 没有直接从注册接口的返回值获取新用户信息,反而依赖Auth模块的全局
currentUser状态读UID。正常注册流程下,createUserWithEmailAndPassword执行完成后会自动把新用户设为全局currentUser,但如果你的注册逻辑是二次封装、或者Auth状态存在同步延迟,就会读到上一次残留的旧登录用户的UID。 - 原有写入Firestore的写法本身有错误:
.doc(emailRef)传入的是React的ref对象(useRef返回的带current属性的对象),根本不是实际的邮箱字符串值,就算之前能运行也不是你预期的按邮箱命名文档的逻辑。
修正方案
- 调整注册函数的调用逻辑,直接接收注册接口返回的用户凭证对象,从凭证里直接提取新用户的UID,完全绕开全局
currentUser的同步时序问题,从根源上避免读到旧用户UID的问题。 - 将Firestore写入时的文档ID替换为新用户的UID,替换原本用邮箱当文档名的逻辑。
修正后的核心代码如下:
try { setError(""); setLoading(true); // 直接获取注册接口返回的用户凭证,这里的user就是刚完成注册的新用户 const userCredential = await signup(emailRef.current.value, passwordRef.current.value); const newUserUid = userCredential.user.uid; // 用新用户UID作为users集合的文档ID写入用户基础信息 await db .collection("users") .doc(newUserUid) .set( { firstName: firstNameRef.current.value, lastName: lastNameRef.current.value, }, { merge: true } ) }
额外注意事项
- 检查你自己封装的
signup函数实现,必须确保它正确返回了createUserWithEmailAndPassword的Promise结果,不能漏写return。如果封装时漏了返回值,await注册函数拿到的会是undefined,根本没等注册接口执行完成就会立刻执行后续逻辑,这也是这类“拿到旧UID”问题最常见的诱因。 - 这种从接口返回值直接取UID的方案不存在时序竞争问题,不管Auth全局状态有没有同步完成,拿到的都是刚创建的新用户的准确UID,可靠性远高于读取全局
currentUser。
内容的提问来源于stack exchange,提问作者Nathan McKenzie
相关产品推荐
相关产品推荐

