我正在使用Supabase后端用React.js写一个网站。我遇到了身份验证和从当前会话中检索数据的问题。
我的整个应用程序都由AuthContext Package 。当我更改一些代码,React自动刷新更改时,一切正常。问题是,当我实际上想重新加载页面(F5),然后函数getUserId获得参数(电子邮件),这是未定义的。我在一些组件中遇到了同样的问题,我想根据currentUser.email从数据库中检索一些数据...
我的问题是:**如何确保在检索数据之前加载currentUser?**找到一些关于Promise / async / await的信息,但无法通过它。我是初学者。
我在这里有:
状态保存currentUser(来自auth),userId(来自数据库)
const [currentUser, setCurrentUser] = useState(true)
const [userId, setUserId] = useState('')
使用检测授权状态变化的效果:
useEffect(() => {
setIsUserLoading(true)
auth.onAuthStateChange((event, session) => {
try {
console.log(event, session)
setCurrentUser(session?.user)
console.log('mail', currentUser.email)
} catch (error) {
console.log(error)
}
if (session?.user) {
//want to get & set user id here! (code below)
getUserId(currentUser?.email)
}
})
setIsUserLoading(false)
}, []
)
函数getUserId(email)从数据库中读取userId并赋给state
async function getUserId(email) {
try {
const { data, error } = await supabase
.from('Users')
.select('uuid')
.like('e-mail', email)
if (error) throw (error)
if (data != null) {
console.log('getUserId', "User ID retrieved successfully")
setUserId(data[0].uuid)
}
else if (data == null) {
console.log('getUserId', "Not able to load User ID")
}
else {
console.log('getUserId', "Different error")
}
} catch (error) {
console.log('getUserId catch', error)
}
}
我试着做一些[loadingState,setLoadingState]并将setLoadingState(false)放在auth.onAuthStateChanged之前和之后(true),但它不起作用,因为它是异步的,我猜
1条答案
按热度按时间zpjtge221#
为了确保在检索数据之前加载
currentUser
,可以在useEffect
函数中使用async/await
。下面是代码的更新版本:在这个更新的代码中,
fetchUserData
是一个异步函数,它处理获取用户数据并相应地设置状态值。它使用await
来确保在继续检索用户ID之前获取currentUser
。此外,我在设置
currentUser
之前添加了auth.refreshSession()
,以确保在重新加载页面时刷新会话并保持最新。请记住在代码中导入必要的模块(
auth
、supabase
等)。我希望这对你有帮助!如果你还有什么问题就告诉我。