首页 > 解决方案 > 如何使用 Promise 创建受保护的路由

问题描述

我正在使用钩子来保护我的路线。我遇到的问题是检查用户身份验证状态的调用返回一个 Promise,因此该钩子返回默认值,即 a,然后身份验证状态不再有用,因为我们已经重定向。

那么我怎么能等到身份验证检查完成才从钩子返回呢?这是我的代码:

export function ProtectedRoute(props){

const [loggedIn, setLoggedIn] = useState(false);

// Similar to componentDidMount and componentDidUpdate:
useEffect(() => {
    async function fetchUser() {
        let user = null;

        try {
            user = await Auth.currentAuthenticatedUser()
            if (user) {
                setLoggedIn(true);
            } else
            {
                setLoggedIn(false);
            }
        } catch (e) {
            setLoggedIn(false);
        }
    }
    fetchUser()
});

console.log("ProtectedRoute: returning " + loggedIn);
if (loggedIn)
    return props.component
else
    return <Redirect to={{pathname: '/login'}}/>

}

标签: reactjsreact-routeramazon-cognitoreact-router-domaws-amplify

解决方案


我会添加一个新状态,loading直到 ist true,只渲染一个加载组件:

    export default ProtectedRoute(props) {
    
      const [loggedIn, setLoggedIn] = useState(false);
      const [loading, setLoading] = useState(true);
      
      useEffect(() => {
        (async () => {
          try {
            setLoading(true);
            const user = await Auth.currentAuthenticatedUser();
            setLoggedIn(!!user);
          } catch (error) {
            console.log(error);
            setLoggedIn(false);
          } finally {
            setLoading(false);
          }
        })();
      }, []);
    
      if(loading) return <h1>Loading...</h1>;
        
      if (loggedIn) return props.component
    
      return <Redirect to={{ pathname: '/login' }}/>
  }

推荐阅读