Я создаю приложение React и работаю над его аутентификацией пользователя.
В настоящее время я использую BrowserRouter из реагирующего маршрутизатора для управления маршрутизацией в моем приложении.
У меня есть регистрация Route и все другие компоненты Routes обернуты в функцию «withAuth».
Роль 'withAuth' состоит в том, чтобы видеть, имеет ли приложение аутентифицированное использование. Если пользователь прошел аутентификацию, компонент должен загрузиться (проблема здесь!), Иначе он должен быть перенаправлен на компонент входа (работает нормально!).
После входа в систему, когда приложение перенаправляет на путь, по которому компонент помещается в функцию withAuth. Я получаю следующую ошибку:
TypeError: Object (...) не является функцией
(анонимная функция)
F: /Projects/beyouplus/beyouplus/beyouplus-client/src/services/auth.service.js: 14
11 | return useContext (MyContext)
12 | } * +1010 *
13 |
> 14 | экспорт const withAuth = (Компонент) => (реквизит) => {
15 | if (! isSignedIn ()) {
16 | if (props.history.location.pathname === '/ вход в систему') {
17 | вернуть ноль
My App.js:
import React from 'react';
import {
BrowserRouter,
Route,
Redirect
} from 'react-router-dom'
// Import Screens
import SignInScreen from './components/SignInScreen'
import DepartmentScreen from './components/DepartmentScreen'
// Import Services
import { withAuth } from './services/auth.service'
const App = () => (
<BrowserRouter>
<Route exact path="/sign-in" component={SignInScreen}/>
<Route exact path="/dept" component={withAuth(DepartmentScreen)}/>
<Route exact path="/" render={redirectToDept} />
</BrowserRouter>
)
const redirectToDept = () => (
<Redirect to="/dept" />
)
export default App;
Файл auth.service.js:
import React, { useContext } from 'react'
import { Redirect } from 'react-router-dom'
import client from '../client'
import { getMeQuery } from '../graphql/queries'
import { useCacheService } from './cache.service'
const MyContext = React.createContext(null)
export const useMe = () => {
return useContext(MyContext)
}
export const withAuth = (Component) => (props) => {
if (!isSignedIn()) {
if (props.history.location.pathname === '/sign-in') {
return null
}
return (
<Redirect to="/sign-in" />
)
}
const { data, error, loading } = getMeQuery()
useCacheService()
if(loading) return null
if(error || !data.me) {
signOut()
return <Redirect to="/sign-in" />
}
console.log(data.me)
return (
<MyContext.Provider value={data.me}>
<Component {...props} />
</MyContext.Provider>
)
}
export const isSignedIn = () => {
//return /authToken=.+(;!$)/.test(document.cookie)
return document.cookie.includes('authToken')
}
EDIT:
Я пришел, чтобы выяснить, что проблема была с синтаксисом объявления этого с помощью AOC HOC, я обновил его следующим образом, и он загружается просто отлично. За исключением случаев, когда я использую "componentDidMount" для выполнения запроса graphql, HOC не выполняет "componentDidMount".
auth.service.js
export const withAuth = (Component) => {
return class extends React.Component {
state = {
data: null
}
componentDidMount() {
if (!isSignedIn()) {
if (this.props.history.location.pathname === '/sign-in') {
return null;
}
return (
<Redirect to="/sign-in" />
);
}
const { data, error, loading } = getMeQuery;
useCacheService();
if (loading) return null;
if (data === undefined) return null;
if (error || !data.me) {
signOut();
return <Redirect to="/sign-in" />;
}
this.setState({
data
})
}
render() {
const { data } = this.state;
return (
<MyContext.Provider value={data.me}>
<Component {...this.props} />
</MyContext.Provider>
)
}
}
}
Итак, я получаю ошибку
TypeError: Невозможно прочитать свойство 'me' со значением NULL
/> 52 |
из render () внутри HOC.