localStorage 需要时间在反应中存储令牌

Posted

技术标签:

【中文标题】localStorage 需要时间在反应中存储令牌【英文标题】:localStorage taking time to store token in react 【发布时间】:2021-11-15 21:51:49 【问题描述】:

我正在尝试将 JWT 令牌存储到 localStorage。它可以正确存储而没有问题。但是,当我将 localStorage 中的令牌作为 API 中的 Authorization 标头结束时,它会变为空。但是当我重新加载页面时,我从数据库中得到了正确的响应。 代码如下:

Home.js

useEffect(() => 
const queryParams = new URLSearchParams(window.location.search);
setToken(queryParams.get("token"))
localStorage.setItem('token', token)

setRedirect(true)
, []);

if (redirect) 
    return (
      <Redirect
        to=
          pathname: "/chatroom",
          state:  token.id ,
        
      />
    );
  
return ""; 

Apihelper.js

const token = localStorage.getItem("token");

const headers = 
  Authorization: `Bearer $token`,
;

export const initiateChat = async (data) =>
  await axios.post(`$API/room/initiate`, data, 
    headers,
 );

Chatroom.js

import  initiateChat  from "../Apihelper";

const Chatroom = (props) => 

useEffect(() => 
    setLoading(true);
    initiateChat(user, props.location.state).then((data) => setUsers(data))
, []);



当我点击这个initiateChat API 时,我得到 401,即 Invalid Token。但是当我重新加载页面时,我得到了预期的响应。 我认为是它第一次访问 API 时,发现 localStorage 中没有令牌,因为它可能在 localStorage 中有任何数据之前就被调用了。但是当我重新加载它时,我得到了正确的响应,因为现在 localStorage 中有一个令牌。

我怎样才能等到它不在 localStorage 中存储令牌??

【问题讨论】:

Home.js 中,useEffect 中的前 3 行:按照你的说法,他们应该做什么?他们什么时候被处决?在initiateChat 之前还是之后?想想…… Home.js 为入口页面。我正在尝试从 url 获取 jwt 令牌并将其保存在 localStorage 中以使用授权标头进行 API 调用。 【参考方案1】:

您需要添加token 作为useEffect 调用的依赖项:

useEffect(() => 
   const queryParams = new URLSearchParams(window.location.search);
   setToken(queryParams.get("token"))
   localStorage.setItem('token', token)

   setRedirect(true)
, [token]);

【讨论】:

以上是关于localStorage 需要时间在反应中存储令牌的主要内容,如果未能解决你的问题,请参考以下文章

反应:通过状态钩子在 loginHandler 函数中向 localStorage 添加令牌不起作用

AngularJS SPA 需要重新加载以识别 localstorage 中的 jwt 令牌

我在哪里可以将 jwt 令牌存储在 localStorage 中?

为啥 auth0 建议不要在 localStorage 中存储令牌?

加密,然后将访问令牌存储在 localStorage

AngularJS - 如何在 $localStorage 中存储 JWT 令牌