开发者问题收集

axios 拦截器的正确使用方法

2022-01-31
10213

我想将 jwt 令牌添加到 Login.js 中的 axiosinstance,但它给出了错误

IDX12729: Unable to decode the header '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]' as Base64Url encoded ...]

这是我的代码:

Login.js

const printValues = e =>{

      axiosInstance.post('/auth', data)
.then(res =>{

  console.log("adding token");
  
  const config = axiosInstance.interceptors.request.use(function (config) {
    
    config.headers.Authorization =  res.data.token;

    return config;
  });

  axiosInstance.get('/User/GetUserByID/0', config)
  .then(res =>{
    //set user details
  })
  .catch(err =>{
    console.log(err);
  })
}
2个回答

use 不会返回配置供您传递到请求中。只要您使用同一个实例,配置就会被更改。

  axiosInstance.interceptors.request.use(function (config) {
    
    config.headers.Authorization =  res.data.token;

    return config;
  });

  axiosInstance.get('/User/GetUserByID/0')
  .then(res =>{
    //set user details
  })
  .catch(err =>{
    console.log(err);
  })
Ricky Mo
2022-01-31

首先,不要在响应处理程序中定义拦截器。这意味着每次发出该请求时,您都会添加一个拦截器。

通常,您会将令牌状态和拦截器与其他应用程序代码分开。无论您在哪里创建 axiosInstance 都是一个不错的选择。

例如...

import axios from "axios"

const axiosInstance = axios.create({
  // ..
})

const token = null // initial state

axiosInstance.interceptors.request.use(async config => {
  if (!token) {
    // note, use a separate axios instance for this request
    const { data } = await axios.post("/auth", dataFromSomewhere)
    token = data.token
  }

  config.headers.Authorization = `Bearer ${token}` // you may need "Bearer" here
  return config
})

现在,您可以使用 axiosInstance 发出请求,如果需要,它将在继续之前透明地解析您的授权令牌。

const printValues = e => {
  axiosInstance.get("/User/GetUserByID/0")
  .then(res =>{
    //set user details
  })
  .catch(err =>{
    console.log(err);
  })
}
Phil
2022-01-31