Я хочу проверить, прошел ли пользователь аутентификацию в моем приложении React.Используя это руководство.
Я написал обертку над моим <Route />
классом, который проверяет, аутентифицирован ли пользователь, затем мы визуализируем компонент, если нет, мы просто перенаправляем его на вход.page.
const IsAuthenticatedRoute = function ({ component: Component, ...rest }) {
return (
<Route {...rest} render={async (props) => {
return (
await store.isAuthenticatedAsync() === true // here is the point of troubles
? <Component {...props} />
: <Redirect to={{
pathname: '/sign-in',
state: { from: props.location }
}} />
)
}} />)
}
И я использую его в своем маршрутизаторе следующим образом:
ReactDOM.render(
<Provider store={appStore}>
<Router>
<div>
<Switch>
<Route exact path='/' component={App} />
<IsAuthenticatedRoute path='/protected-route' component={Profile} />
</Switch>
</div>
</Router>
</Provider>
,
document.getElementById('root')
)
Я хочу выполнить мой асинхронный запрос к серверу, чтобы проверить, аутентифицирован ли пользователь.Я пытался добавить ключевое слово async
к своим функциям через вызов await
, но выдает ошибку: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
.Я почти пытался использовать обещания, но это тоже не помогло.Когда я использую Promise
внутри своей функции и возвращаю <Route />
в операторе .then()
, React говорит мне: IsAuthenticatedRoute(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.
Так что я ожидаю обработать свою асинхронную функцию, а затем после того, как получу ответ от сервера, дайте доступ моему пользователю, чтобы посетить эту страницу.Это возможно только при отправке синхронного запроса на мой сервер или есть другие способы сохранить мой код асинхронным и передать пользователя на защищенную страницу?