我正在构建一个使用Firebase进行身份验证的React Native应用。之所以会出现此问题,是因为Firebase在创建帐户后会自动登录用户,这会导致设置用户数据时出现问题。
Firebase建议使用onAuthStateChanged
回调来观察用户登录和注销的时间。之所以会出现周期,是因为我需要在创建帐户后设置用户的本地Redux状态,但是onAuthStateChanged
在创建用户后立即运行,并在创建之前触发用户状态的加载。
当用户登录或重新启动应用程序时,我需要加载他们存储在数据库中的现有帐户信息。这要求在loadUserLocal
回调注意到身份验证状态更改后的某个时刻触发onAuthStateChanged
方法,但这似乎与创建新用户的方式发生冲突。 onAuthStateChanged
回调基本上在用户的新帐户具有其初始数据集之前劫持了导致调用loadUserLocal
的过程。
在我看来,解决此问题的最简单方法是,在创建新帐户之后,我可以避免Firebase的自动登录,但是我能找到的唯一方法相当复杂,并且涉及{{3} }。这似乎有些矫kill过正。
我尝试解决的其他方法最终多次调用loadUserLocal
,基本上忽略了第一个无用的调用,因为尚未保存数据。
signUp
方法如下:
export async function signUp(dispatch, email, password) {
const userData = {
<...initial user data is set here...>
}
await auth.createUserWithEmailAndPassword(email, password)
await saveUserLocal(userData)
setUserData(dispatch, userData)
}
出现问题是因为auth.createUserWithEmailAndPassword
方法在onAuthStateChanged
有机会运行之前触发了saveUserLocal
方法。身份验证的更改导致loadUserLocal
在saveUserLocal
之前被调用,因此userData
不包含必要的信息。
我想出了避免这种情况的方法,但是随后我遇到了登录和刷新过程的问题。他们都需要触发对loadUserLocal
的调用才能为现有用户检索必要的信息。每当我尝试一种方法来解决其中一个问题时,其他方法似乎都无法解决。一切似乎都与Firebase在用户创建后强制登录这一事实有关,这意味着我无法在用户登录之前设置用户的帐户数据并需要该数据。在使用Firebase创建用户之前,我曾尝试保存用户的帐户详细信息,但是要保存他们的信息,我需要Firebase创建的用户UID。这导致了与以前相同的依赖周期。