javascript Supabase onAuthStateChanged -如何确保在重新加载页面时加载了currentUser?

vmdwslir  于 2023-06-04  发布在  Java
关注(0)|答案(1)|浏览(91)

我正在使用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),但它不起作用,因为它是异步的,我猜

zpjtge22

zpjtge221#

为了确保在检索数据之前加载currentUser,可以在useEffect函数中使用async/await。下面是代码的更新版本:

useEffect(() => {
  setIsUserLoading(true);
  
  const fetchUserData = async () => {
    const session = await auth.refreshSession(); // Refresh the session to ensure currentUser is up to date
    setCurrentUser(session?.user);
    
    if (session?.user) {
      try {
        const { data, error } = await supabase
          .from('Users')
          .select('uuid')
          .like('e-mail', session.user.email);
          
        if (error) throw error;
        
        if (data != null && data.length > 0) {
          console.log('getUserId', 'User ID retrieved successfully');
          setUserId(data[0].uuid);
        } else {
          console.log('getUserId', 'Not able to load User ID');
        }
      } catch (error) {
        console.log('getUserId catch', error);
      }
    }
    
    setIsUserLoading(false);
  };
  
  fetchUserData();
}, []);

在这个更新的代码中,fetchUserData是一个异步函数,它处理获取用户数据并相应地设置状态值。它使用await来确保在继续检索用户ID之前获取currentUser
此外,我在设置currentUser之前添加了auth.refreshSession(),以确保在重新加载页面时刷新会话并保持最新。
请记住在代码中导入必要的模块(authsupabase等)。
我希望这对你有帮助!如果你还有什么问题就告诉我。

相关问题