Токен Axios Instance Bearer не обновляется после входа в систему без перезагрузки - React

Когда я пытаюсь войти в свое приложение для реагирования, оно возвращается как успешное и сохраняет его в sessionStorage, но когда я пытаюсь получить доступ к странице, для которой требуется токен Bearer для извлечения данных через axios, он возвращает ошибку http 401.

Но когда я перезагружаю страницу, то результат такой, как требуется.

import axios from "axios";

let token = JSON.parse(window.sessionStorage.getItem("token"));

let AxiosInstance= axios.create({
  baseURL: "https://myurl.com/backend/api/",
  timeout: 5000,
  headers: { Authorization: "Bearer " + token },
});

export default AxiosInstance;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш token инициализируется onload, поэтому вам нужно вызывать токен в config.headers["Authorization"] при каждом запросе через interceptor, поэтому вам не нужно перезагружать страницу.

Перехватчик: Перехватчики Axios — это функции, которые вызываются перед отправкой запроса и после получения ответа.

import axios from "axios";

let AxiosInstance = axios.create({
  baseURL: "https://myurl.com/backend/api/",
  timeout: 5000,
});

AxiosInstance.interceptors.request.use(function (config) {
  let token = JSON.parse(window.sessionStorage.getItem("sessionData"));
  config.headers["Authorization"] = "Bearer " + token;
  return config;
});

export default AxiosInstance;

ОБНОВЛЕНИЕ: Здесь вы можете узнать больше о перехватчиках Axios

Я предполагаю, что это потому, что вы создаете экземпляр axios вне любого жизненного цикла React.

когда вы запускаете свое приложение и входите в экран входа в систему, оно создает экземпляр Axios

import axios from "axios";

let token = JSON.parse(window.sessionStorage.getItem("token"));

let AxiosInstance = axios.create({
  baseURL: "https://myurl.com/backend/api/",
  timeout: 5000,
  headers: { Authorization: "Bearer " + token }, // on the first go token is null
});

export default AxiosInstance;

После входа в систему ваш экземпляр axios все еще имеет нулевой токен, видите ли, этот код выполняется один раз и никогда больше, поэтому, когда вы обновляете страницу, он работает, потому что когда этот фрагмент кода выполняется еще раз, есть токен в локальном хранилище.

Есть пара вещей, которые вы можете сделать, но проще всего использовать перехватчики Axios.

  AxiosInstace.interceptors.request.use(function (config) {
    const token = localStorage.getItem('token');
    config.headers.Authorization =  token ? `Bearer ${token}` : '';
    return config;
  });

Таким образом, каждый раз, когда вы делаете запрос, ваши заголовки будут обновляться (не уверен, что это лучший подход, но он работает).

Я попробовал это, и это работает. У меня возник вопрос, что если токена нет, а авторизация возвращается '', не вызовет ли это какую-либо ошибку.

Shariq Shahid 08.02.2023 13:26

Другие вопросы по теме