localstorage 在页面刷新时在 react-redux 应用程序中返回“未定义”

Posted

技术标签:

【中文标题】localstorage 在页面刷新时在 react-redux 应用程序中返回“未定义”【英文标题】:localstorage returning 'undefined' in react-redux app on page refresh 【发布时间】:2020-08-25 09:50:50 【问题描述】:

我正在使用 react-redux 应用程序并尝试将我的身份验证令牌存储在本地存储中。一旦我的登录 api 调用完成,我将 auth-token 放入 localStorage,如下所示:

function loginSuccess(response) 
  const  accessToken, refreshToken = response;
  localStorage.setItem('accessToken', accessToken);
  localStorage.setItem('refreshToken', refreshToken);

当我重新加载网页时,在我的 App.js 中,当我尝试检索 accessToken 和 refreshToken 时,都返回“未定义”。这是为什么呢?

class App extends React.Component 
  constructor(props) 
    super(props);    ;
    if (localStorage.getItem('accessToken')) 
      authenticationActions.resetHeader();
    
  

【问题讨论】:

我要警告你localStorage 是不安全的。在localStorage 中放置一个刷新令牌(甚至是访问令牌)是一个非常糟糕的主意。另外,您使用 JWT 标记了问题,所以我假设您也将这些问题保存在 localStorage 中,这也非常危险:medium.com/redteam/… 我怀疑您的问题是response 对象不包含值accessTokenrefreshToken。如果它是一个Response 对象(即来自 Fetch API),那么您需要等待response.json() Promise 解析,它将包含数据。 我在执行 localstorage.getItem('accessToken') 的地方放了断点,发现等待一段时间后,返回值。看起来它需要一些时间。这是常见的行为吗? 【参考方案1】:

通常,如果您处于隐身模式,就会发生这种情况。失败...使用调试器并确保accessTokenrefreshToken 不是undefined。如果刷新失败,loginSuccess 函数正在运行,debugger 再次是你的朋友。

【讨论】:

这是个好建议,问题可能是他试图从Response 对象中提取数据。 OP 需要从响应中提取数据,所以这个资源可能有用:developer.mozilla.org/en-US/docs/Web/API/Response

以上是关于localstorage 在页面刷新时在 react-redux 应用程序中返回“未定义”的主要内容,如果未能解决你的问题,请参考以下文章

除非我刷新页面,否则 Javascript localStorage 在其他组件中不可用

Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

vuex和localStorage/sessionStorage 区别

存储数据后是不是有更好的方法从 localStorage 获取数据而不刷新/重新加载页面

不同页面之间的互相影响-localStorage

Vue 刷新页面时会触发事件吗