React Native中Firebase注册时保存用户额外数据问题
问题原因与解决方案
你的代码问题出在Promise的处理方式和用户UID的获取时机上,咱们一步步来修正:
问题分析
- 你在
createUserWithEmailAndPassword的then方法里直接执行了数据库写入操作,没有把它包裹在回调函数中——这会导致数据库操作在用户创建请求还没完成时就被触发,此时firebase.auth().currentUser可能还未更新,根本拿不到正确的用户UID。 - 原代码的错误捕获只覆盖了用户创建阶段,数据库写入环节的错误无法被捕获,出问题也找不到原因。
修正后的代码(推荐async/await写法)
signUpUser = async (email, password, firstName, lastName) => { try { if (password.length < 6) { // 直接用参数更直观,不用取state alert("Please enter at least 6 characters"); return; } // 先完成用户创建,拿到可靠的用户凭证 const userCredential = await firebase.auth().createUserWithEmailAndPassword(email, password); const user = userCredential.user; // 用凭证里的user.uid写入数据库,避免currentUser未更新的问题 await firebase.database().ref(`users/${user.uid}`).set({ firstName: firstName, lastName: lastName }); console.log("用户创建并保存信息成功!"); } catch (error) { console.error("注册出错:", error.toString()); alert(`注册失败:${error.message}`); } }
关键改进点
- 用
async/await让代码逻辑更线性清晰,避免嵌套Promise回调的混乱。 - 直接从
createUserWithEmailAndPassword返回的userCredential中取user.uid,这是获取当前注册用户UID最可靠的方式,不会出现currentUser延迟更新的问题。 - 把数据库写入操作也纳入
try/catch范围,确保任何环节出错都能被捕获并提示。 - 用模板字符串
users/${user.uid}替代字符串拼接,可读性更强。
如果你习惯用链式Promise写法,也可以这样写:
signUpUser = (email, password, firstName, lastName) => { if (password.length < 6) { alert("Please enter at least 6 characters"); return; } firebase.auth().createUserWithEmailAndPassword(email,password) .then(userCredential => { const user = userCredential.user; // 返回数据库操作的Promise,让链式调用能捕获它的错误 return firebase.database().ref(`users/${user.uid}`).set({ firstName: firstName, lastName: lastName }); }) .then(() => { console.log("用户信息保存成功"); }) .catch(error => { console.error("注册出错:", error.toString()); alert(`注册失败:${error.message}`); }); }
这样就能保证用户创建成功后,再把姓名等额外数据稳稳写入数据库啦!
内容的提问来源于stack exchange,提问作者angielle
相关产品推荐
相关产品推荐

