【问题标题】:how to call `localStorage.getItem ` immediately after render如何在渲染后立即调用`localStorage.getItem`
【发布时间】:2021-01-07 13:31:58
【问题描述】:

首先我使用localStorage.setItem 保存我从 api 获取的令牌并将其设置为我的 axios 中的标头

我需要使用local.storage.getItem() 读取数据,然后将其设置为标题
所以还有另一个发送请求的操作,获取令牌并将其保存到本地存储 localStorage.setItem() 并将浏览器历史记录替换到我调用需要令牌的操作的位置,但它显示 404 错误和唯一的第一个错误这意味着只有第一次,如果我关闭页面并再次打开它就可以正常工作
我会一步一步展示代码

这是我要使用令牌的代码

import axios from 'axios';
const token =  localStorage.getItem('token')//here doesn't get it and shows 404 error from API i refresh the page for second time or after 
export default axios.create({

  headers:{"Authorization": `Bearer ${token}`}
})

这是我的操作,我使用不同的 axios 实例获取令牌,它没有 header

export const sendCode = (phone, code) => async dispatch => {
  dispatch({ type: LOADING_STATE })

  const response =
    await loginApi.post(baseurl + "Auth/Checkcode", {
      phone: phone,
      code: code
    },
    )
  dispatch({ type: SEND_CODE, payload: response.data });
  if (response.data.success === true) {
    history.replace('/home')
   localStorage.setItem("token", response.data.obj.token)
  }

最后是我用具有header的实例调用它的操作

export const getHomeInfo = () => async dispatch => {
  dispatch({type:LOADING_STATE})
 const response = await homeAPI.get(baseurl + "Home/GetList")//homeAPI is the instance that has header

  dispatch({ type: GET_HOME_INFO, payload: response.data })
};

【问题讨论】:

  • headers:{"Authorization": Bearer ${localStorage.getItem('token')}} 试试这个
  • 它显示相同的结果

标签: reactjs redux axios


【解决方案1】:
import axios from 'axios';
const token =  localStorage.getItem('token')
export default axios.create({

  headers:{"Authorization": `Bearer ${token}`}
})

这里,在打包js文件时会获取一次token,每次都要重新获取一次:

import axios from 'axios';


const getHeaders = () => {
  const token = localStorage.getItem('token')
  return {"Authorization": `Bearer ${token}`}
}

export default axios.create({
  headers: getHeaders()
})

编辑:上面的代码不起作用,因为 axios.create() 只被调用一次,如果你需要动态标题,你应该添加一个拦截器,它将在每个请求之前调用:

const axiosInstance = axios.create()

axiosInstance.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers.authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error),
);

export default axiosInstance

【讨论】:

  • 我添加了一个编辑,我忘记了 axios.create 只调用了一次,添加一个拦截器允许您在每次请求时获取您的令牌
  • 谢谢,我在哪里可以了解更多关于 axios 拦截器或 axios.create 的信息?
  • 抱歉,我想知道,这是一种不好的做法吗?如你所说interceptor which will be called before each request ,以后会不会有麻烦?
  • 不,不是,在大型应用程序上,您需要拦截器来设置,例如,所需的语言、请求之间可能不同的一些授权,或者仅仅是出于安全目的
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2018-05-22
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多