Firebase创建带额外信息用户时生成undefined子节点问题
解决Firebase注册时生成undefined子节点的问题
嘿,我帮你排查下这个问题——你遇到的undefined子节点,基本是因为用户ID的赋值环节出了问题。从你贴的代码片段来看,你声明了var id : string;但大概率没正确从Firebase Auth的返回结果里拿到真实的用户UID,或者在异步操作完成前就急着用这个变量了,导致id的值是undefined,写入数据库时自然就生成了这个多余的节点。
给你修正后的完整代码,照着这个逻辑来就没问题:
async register(user: User) { try { // 第一步:创建认证用户,等待异步操作完成 const authResult = await firebase.auth().createUserWithEmailAndPassword(user.email, user.password); // 关键!从返回结果里拿到正确的用户UID,这才是和认证ID对应的唯一标识 const userId = authResult.user.uid; // 第二步:用这个UID作为节点名,写入额外用户信息 await firebase.database().ref(`users/${userId}`).set({ email: user.email, fullName: user.fullName, // 这里替换成你需要的额外字段 phone: user.phone, // 其他你想存储的信息 }); console.log("用户注册+信息存储成功!"); } catch (error) { console.error("注册出错啦:", error); throw error; // 可以根据业务需求把错误抛给上层处理 } }
为啥之前会踩坑?
- 你之前的代码里,
id变量可能没等到createUserWithEmailAndPassword异步完成就被使用了,或者根本没从authResult.user.uid赋值,导致它是undefined。 - 当你用
undefined作为数据库节点名时,Firebase就会自动创建一个叫undefined的子节点,把信息存进去,这就是你看到的重复内容的原因。
额外提醒几个小细节:
- 别再用
var声明变量啦,用const或let更安全,避免变量提升带来的意外问题。 - 检查下Firebase数据库的规则,确保认证用户能写入自己的节点,比如可以设置规则:
{ "rules": { "users": { "$userId": { ".write": "auth.uid === $userId" } } } } - 一定要等
createUserWithEmailAndPassword的Promise完全resolve后再去拿UID,异步操作不能急着同步用结果哦。
内容的提问来源于stack exchange,提问作者Hailey C.
相关产品推荐
相关产品推荐

