Создание частного маршрута, когда isAuth приходит из обратного вызова - PullRequest
0 голосов
/ 23 октября 2018

Я использую личную систему маршрутизации реакции маршрутизатора.Я проверяю аутентификацию, получая jwt из localstorage и перекрестную проверку на сервере в axios обещании .

Однако частная маршрутизация, похоже, не ожидает обратного вызовавозвращать.Я делаю аутентификацию неправильно?или есть способ исправить это?

мои аксиосы ​​обещают проверить аутентификацию.

const checkAuth = (cb) => {
    let token = localStorage.getItem("jwtToken");
    // console.log(token);
    if (token) {
        axios.defaults.headers.common["Authorization"] = token;
        axios
            .get("api/admin/auth/profile")
            .then(res => {
                localStorage.setItem("admin", res.data.admin);
                cb(null, res.data);
            })
            .catch(err => {
                showErr(err, cb);
            });
    } else {
        cb("Not authenticated", null);
    }
}

Настройка частного маршрута.

const PrivateRoute = ({ component: Component, ...rest, checkAuth }) => 
(
    <Route {...rest} render={(props) => (
        checkAuth((isAuthenticated) => (
            isAuthenticated === true
            ? <Component {...props} />
            : <Redirect to={{
              pathname: '/login',
              state: { from: props.location }
            }} />
        ))
    )} />
)

1 Ответ

0 голосов
/ 25 октября 2018

Метод checkAuth ничего не возвращает.Функция рендеринга должна возвращать компонент.Я бы предложил создать компонент CheckAuth с таким состоянием, как этот.

class CheckAuth extends React.Component {
  state = {}

  componentDidMount () {
    this.props.checkAuth(isAuthenticated => {
      this.setState({isAuthenticated})
    })
  }

  render () {
     return this.props.children({loading, isAuthenticated})
  }
}

const PrivateRoute = ({ component: Component, ...rest, checkAuth }) => 
(
    <Route {...rest} render={(props) => 
      <CheckAuth {...props} checkAuth={checkAuth}>
       {({isAuthenticated}) => (
         isAuthenticated === true
         ? <Component {...props} />
         : <Redirect to={{
           pathname: '/login',
           state: { from: props.location }
        )}
      </CheckAuth>
    )}</Route>

} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...