Для того, чтобы сделать автоматический выход из системы (инициированный приложением реагирования, без взаимодействия с пользователем и вызовами API) из моего приложения реагирования-администрирования (реагирования-администрирования версии 2.8.3), как только истекает срок действия JWT.Я делаю периодическую проверку и отправляю действие userLogout
, которое я импортировал из ra-core/authActions
, точно так же, как кнопка выхода из системы (ra-ui-materialui/auth/Logout
).
К сожалению, ra-ui-materialui/esm/layout/Menu.js
выдает ошибку в строке 116 с жалобой нанеопределенное свойство: TypeError: Невозможно прочитать свойство 'pathname' с нулевым значением
return {
114 | open: state.admin.ui.sidebarOpen,
115 | resources: getResources(state),
> 116 | pathname: state.router.location.pathname
117 | };
С помощью инструментов Chrome Chrome я получаю сообщение о том, что хранилище redux router
имеет свойство location
, которое является нулевым.
Есть ли лучший способ выйти из системы после истечения срока действия JWT?Если нет, что мне нужно сделать, чтобы действие userLogout
заработало?
Может быть, кто-то может объяснить, почему Menu.js
кажется тесно связанным с действием userLogout
.
Исходный код моего компонента выглядит следующим образом:
import React from 'react'
import { connect } from 'react-redux'
import { userLogout } from 'react-admin'
import { hasValidJWT } from '../authProvider'
class PeriodicAuthCheck extends React.Component {
constructor(props) {
super(props)
// interval in seconds
this.interval = 60
}
authCheck(loginPath, dispatchAction) {
if (!hasValidJWT()) {
if (window.location.hash !== `#${loginPath}`) {
console.log(`JWT has expired, redirecting to ${loginPath}`)
/*
this is my workaround:
window.location.replace(`/#${loginPath}`)
*/
dispatchAction(loginPath)
}
}
}
componentDidMount() {
this.authCheck(this.props.loginPath, this.props.logout)
this.interval = setInterval(this.authCheck, this.interval * 1000, this.props.loginPath, this.props.logout)
}
componentWillUnmount() {
if (this.interval) {
clearInterval(this.interval)
this.interval = undefined
}
}
render() {
return null
}
}
const mapDispatchToProps = dispatch => {
return {
logout: (loginPath) => dispatch(userLogout(loginPath))
}
}
export default connect(null, mapDispatchToProps)(PeriodicAuthCheck)
Заранее спасибо!Томас