React Native调用Firebase重置密码接口成功时返回null问题
问题现象
调用Firebase密码重置功能时出现如下表现:
- 传入已在Firebase中存在的有效邮箱时,接口调用成功但返回值为
null - 传入错误/未注册邮箱时,接口可正常鉴权并返回对应错误对象
- 项目依赖版本:
@react-native-firebase/app: ^14.2.1@react-native-firebase/auth: ^14.2.1
原功能实现代码如下:
//login with firebase const ForgotPasswordRequest = async () => { try { setIsLoading(true); const res = await auth().sendPasswordResetEmail(SignupDetails.email); //email is passing console.log(res); // getting null here setIsLoading(false); } catch (error) { setIsLoading(false); if (error.code === 'auth/email-already-in-use') { alert('That email address is already in use!'); } if (error.code === 'auth/invalid-email') { alert('That email address is invalid!'); } if (error.code === 'auth/user-not-found') { alert('There is no user record with this email!'); } console.error(error); } };
原因说明
该表现是SDK的正常设计,不属于功能bug:sendPasswordResetEmail是操作型接口,核心逻辑是触发Firebase向目标邮箱发送重置链接,接口本身没有需要返回的业务数据,因此Promise成功态不会携带有效返回值,拿到null即代表接口调用成功,重置邮件已经进入Firebase的发信队列。
只有接口调用失败时,才会在catch分支中抛出携带错误码的error对象,和当前观测到的现象完全一致。
代码优化建议
原有代码存在几处可调整的问题:
- 多余的返回值接收:不需要定义
res变量存储接口返回,只要Promise没有抛出错误就代表执行成功 - 无效错误码判断:
auth/email-already-in-use是创建用户账号接口的专属错误码,密码重置场景永远不会触发该错误,可直接移除 - 重复的loading状态设置:成功、失败分支分别写
setIsLoading(false)存在冗余,可通过finally统一处理 - 缺少成功态反馈:用户触发请求后没有成功提示,无法感知邮件已发送
优化后的代码如下:
const ForgotPasswordRequest = async () => { try { setIsLoading(true); await auth().sendPasswordResetEmail(SignupDetails.email); alert('密码重置邮件已发送,请查收邮箱完成后续重置操作'); } catch (error) { let errTip = '重置请求失败,请稍后重试'; switch (error.code) { case 'auth/invalid-email': errTip = '输入的邮箱格式无效,请检查后重新输入'; break; case 'auth/user-not-found': errTip = '该邮箱未注册对应账号,请确认邮箱输入正确'; break; case 'auth/too-many-requests': errTip = '短时间内请求次数过多,请稍后再试'; break; } alert(errTip); console.error('密码重置接口错误:', error); } finally { setIsLoading(false); } };
内容的提问来源于stack exchange,提问作者Wahas Ali Mughal
相关产品推荐
相关产品推荐

