【发布时间】:2018-11-05 23:37:49
【问题描述】:
如果用户在允许访问之前已登录,我正在尝试通过检查我的快速服务器来阻止对私有路径的访问,否则重定向到登录。
我创建了一个与服务器检查的私有路由函数。问题是,我不知道如何让它等待响应,然后再决定路由到哪个组件(私人页面与登录)。
const isAuthed = () => {
fetch('/api/checkLogin', {
method: 'GET',
credentials: 'include'
})
.then(response => {
console.log(response.status == 200);
return response.status == 200;
});
}
const PrivateRoute = ({ component: Component, ...rest }) => {
return (
<Route
{...rest}
render={props =>
isAuthed() == true ? (
<Component {...props} />
) : (
<Redirect
to={{
pathname: "/login",
state: { from: props.location }
}}
/>
)
}
/>
);
}
这总是重定向到登录...
有什么想法吗?
编辑 1 以下是 PrivateRoute 的使用方式。
const Routing = (props) => (
<div>
<Switch>
<Route exact path='/' component={Home} />
<PrivateRoute exact path='/profile' component={Profile} />
<PrivateRoute exact path='/auction_list' component={Auctions} />
</Switch>
</div>
)
有了反应,似乎我在调用路由组件时必须返回一些东西。我无法对 PrivateRoute 进行异步调用,然后让该异步调用返回更新。
编辑 2 我尝试使用 react-redux 来存储登录数据,这样我就不必对服务器进行异步调用来进行身份验证。但是,刷新页面会清除所有 redux 存储,所以就好像用户在刷新后没有登录一样,这很笨拙。
我想把信息放在会话存储中。但是用户将无法一次注销所有机器。
我最终从每个私有组件的 componentWillMount ping 服务器。私人页面可能会闪烁几分之一秒,但这是迄今为止我能做的最好的……如果有更好的方法,请告诉我……一定有。
【问题讨论】:
-
是的。 IsAuthed 没有返回 true。
-
IsAuthed 如果我们等待 fetch 返回响应(如果用户被授权)@fabbb,将返回 true
-
isAuthed() 是一个异步调用,当作为普通方法调用时将返回 undefined,因此
isAuthed() == true将始终为 false。理想的方法是在父组件中进行异步调用并将isAuthenticated作为道具传递给 PrivateRoute 组件。
标签: javascript reactjs