【发布时间】:2021-05-09 20:34:30
【问题描述】:
我正在做一个项目,在前端使用 React,在后端使用 Django。
我在 React 中使用了 useState 函数来处理 isConnected 变量。
我现在的问题是,每当我刷新网页时,isConnected 都会采用初始值,这是错误的,这是我的代码:
const [isConnected, setIsConnected] = useState(false)
useEffect( async () => {
async function checkJWTValidity(){
try{
axios.defaults.headers.post['Authorization'] = "JWT "+localStorage.getItem("token")
//fetching ME data from API
const requestdata = await axios.post(
utils.endpoint,{query: utils.meQuery}
)
//checking if the returned Data is NULL, if so, tokens would be deleted from localStorage.
//else token variables will remain for its still valid.
if(requestdata.data.data.me === null){
const tokenItems = await getNewJWT(localStorage.getItem("refreshToken"))
if(tokenItems.length === 0){
localStorage.removeItem("token")
localStorage.removeItem("refreshToken")
setIsConnected(false)
console.log("null")
}
else{
localStorage.setItem("token", tokenItems[0])
localStorage.setItem("refreshToken", tokenItems[1])
setIsConnected(true)
}
}
else{
console.log(isConnected)
setIsConnected(true)
}
}
catch(err){
console.log(err)
}
}
async function getNewJWT(refreshToken){
const token = []
try{
//fetching refreshToken data from API
const requestdata = await axios.post(
utils.endpoint,
{
query: utils.refreshQuery(refreshToken)
}
)
//checking if the returned Data is NULL, if so, tokens would be deleted from localStorage.
//else token variables will remain for its still valid.
if(requestdata.data.data.refreshToken.errors === null){
token.push(requestdata.data.data.refreshToken.token.toString())
token.push(requestdata.data.data.refreshToken.refreshToken.toString())
}
}
catch(err){
console.log(err)
}
return token
}
checkJWTValidity();
}, [])
如果有任何我可以做的最佳解决方案,请告诉我! 谢谢
【问题讨论】:
-
函数运行后
isConnected最终是否设置为 true? -
@shn,是的,每次刷新,它先是假,然后是真
-
您希望它自动成为
true?假设需要 JWT 验证步骤,则存储的令牌可能会在不可避免的时间内无法验证。 -
@shn 好吧,起初它并没有引起任何问题,但是当我尝试访问我的 /Account 页面时,它会将我重定向到主页,因为 isConnected 是错误的,因为该页面重新加载..
标签: javascript reactjs authentication web