Я использую перехватчики запросов и ответов.
Перехватчик запросов — он используется для помещения токена доступа в заголовок авторизации для каждого запроса.
Перехват ответа — он используется для проверки того, был ли ответ «Неавторизованный» с кодом состояния 401. Он предназначен для проверки того, истек ли срок действия токена доступа, если срок действия токена доступа истек, а затем обновить токен доступа (путем вызова API ) и после получения новый токен доступа снова делает этот исходный запрос с новым токеном доступа, эта часть работает отлично.
Диспетчеризация действий – я использовал набор инструментов Redux для хранения состояния моего приложения
Итак, что происходит, когда я делаю исходный запрос с новым токеном доступа, результат возвращается, но я хочу отправить то же действие, которое ранее было вызвано для этого исходного запроса, чтобы я мог сохранить результат нового вызова API внутри redux
было бы не было проблем, если было только одно действие отправки, но их несколько, поскольку у меня много компонентов, и каждый компонент имеет свое собственное действие отправки.
как мне написать код, чтобы убедиться, что новый API вызов с новым токеном доступа отправляет то же действие, которое было отменено из-за ошибки 401
import axios from "axios";
import { api } from "../config";
import { refreshAccessToken } from "./fakebackend_helper";
axios.defaults.withCredentials = true;
axios.defaults.baseURL = api.API_URL;
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.interceptors.request.use(function (config) {
const latestToken = localStorage.getItem("access_token"); // Fetch the latest token
if (latestToken) {
config.headers.Authorization = `Bearer ${latestToken}`;
}
return config;
});
axios.interceptors.response.use(
function (response) {
return response.data ? response.data : response;
},
async function (error) {
try {
const errorResponse = error.response;
if (
errorResponse.status === 401 &&
errorResponse.data.message === "Unauthorized" &&
!error.config._retry
) {
const res = await refreshAccessToken();
const newAccessToken = res.data.access_token;
error.config._retry = true;
axios.defaults.headers.common[
"Authorization"
] = `Bearer ${newAccessToken}`;
localStorage.setItem("access_token", newAccessToken);
sessionStorage.setItem("access_token", newAccessToken);
error.config.headers["Authorization"] = `Bearer ${newAccessToken}`;
console.log("ERROR RE-REQUEST CONFIG ->", error.config);
return axios(error.config);
}
return Promise.reject(error);
} catch (error) {
console.log("Error while re-requesting the access token ->", error);
return Promise.reject(error); //
}
}
);
< /code>
Вот код одного из редукторов < /p>
import { createSlice } from "@reduxjs/toolkit";
import {
inviteWorkspaceMember,
setPasswordWorkspaceMember,
getWorkspaceMembers,
} from "./thunk";
export const initialState = {
workspaceMembers: [],
error: "",
};
const workspaceMembersSlice = createSlice({
name: "workspaceMembers",
initialState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(getWorkspaceMembers.fulfilled, (state, action) => {
state.workspaceMembers = action.payload.workspaceMembers;
});
builder.addCase(inviteWorkspaceMember.fulfilled, (state, action) => {
state.workspaceMembers = [...state.workspaceMembers, action.payload.data];
});
},
});
export default workspaceMembersSlice.reducer;
Вот это идея
import { createAsyncThunk } from "@reduxjs/toolkit";
import {
getWorkspaceMembers as getWorkspaceMembersApi,
inviteWorkspaceMember as inviteWorkspaceMemberApi,
setPasswordWorkspaceMember as setPasswordWorkspaceMemberApi,
} from "../../helpers/fakebackend_helper";
export const getWorkspaceMembers = createAsyncThunk(
"workspaceMembers/getWorkspaceMembers",
async (workspaceId) => {
try {
const response = await getWorkspaceMembersApi(workspaceId);
return response;
} catch (error) {
console.log("error inside getting workspace members thunk", error);
}
}
);
Подробнее здесь: https://stackoverflow.com/questions/793 ... api-call-t
Как отправить то же действие внутри перехватчика Axios после создания нового вызова API через перехватчик ⇐ Javascript
Форум по Javascript
1737876985
Anonymous
Я использую перехватчики запросов и ответов.
Перехватчик запросов — он используется для помещения токена доступа в заголовок авторизации для каждого запроса.
Перехват ответа — он используется для проверки того, был ли ответ «Неавторизованный» с кодом состояния 401. Он предназначен для проверки того, истек ли срок действия токена доступа, если срок действия токена доступа истек, а затем обновить токен доступа (путем вызова API ) и после получения новый токен доступа снова делает этот исходный запрос с новым токеном доступа, эта часть работает отлично.
Диспетчеризация действий – я использовал набор инструментов Redux для хранения состояния моего приложения
Итак, что происходит, когда я делаю исходный запрос с новым токеном доступа, результат возвращается, но я хочу отправить то же действие, которое ранее было вызвано для этого исходного запроса, чтобы я мог сохранить результат нового вызова API внутри redux
было бы не было проблем, если было только одно действие отправки, но их несколько, поскольку у меня много компонентов, и каждый компонент имеет свое собственное действие отправки.
как мне написать код, чтобы убедиться, что новый API вызов с новым токеном доступа отправляет то же действие, которое было отменено из-за ошибки 401
import axios from "axios";
import { api } from "../config";
import { refreshAccessToken } from "./fakebackend_helper";
axios.defaults.withCredentials = true;
axios.defaults.baseURL = api.API_URL;
axios.defaults.headers.post["Content-Type"] = "application/json";
axios.interceptors.request.use(function (config) {
const latestToken = localStorage.getItem("access_token"); // Fetch the latest token
if (latestToken) {
config.headers.Authorization = `Bearer ${latestToken}`;
}
return config;
});
axios.interceptors.response.use(
function (response) {
return response.data ? response.data : response;
},
async function (error) {
try {
const errorResponse = error.response;
if (
errorResponse.status === 401 &&
errorResponse.data.message === "Unauthorized" &&
!error.config._retry
) {
const res = await refreshAccessToken();
const newAccessToken = res.data.access_token;
error.config._retry = true;
axios.defaults.headers.common[
"Authorization"
] = `Bearer ${newAccessToken}`;
localStorage.setItem("access_token", newAccessToken);
sessionStorage.setItem("access_token", newAccessToken);
error.config.headers["Authorization"] = `Bearer ${newAccessToken}`;
console.log("ERROR RE-REQUEST CONFIG ->", error.config);
return axios(error.config);
}
return Promise.reject(error);
} catch (error) {
console.log("Error while re-requesting the access token ->", error);
return Promise.reject(error); //
}
}
);
< /code>
Вот код одного из редукторов < /p>
import { createSlice } from "@reduxjs/toolkit";
import {
inviteWorkspaceMember,
setPasswordWorkspaceMember,
getWorkspaceMembers,
} from "./thunk";
export const initialState = {
workspaceMembers: [],
error: "",
};
const workspaceMembersSlice = createSlice({
name: "workspaceMembers",
initialState,
reducers: {},
extraReducers: (builder) => {
builder.addCase(getWorkspaceMembers.fulfilled, (state, action) => {
state.workspaceMembers = action.payload.workspaceMembers;
});
builder.addCase(inviteWorkspaceMember.fulfilled, (state, action) => {
state.workspaceMembers = [...state.workspaceMembers, action.payload.data];
});
},
});
export default workspaceMembersSlice.reducer;
Вот это идея
import { createAsyncThunk } from "@reduxjs/toolkit";
import {
getWorkspaceMembers as getWorkspaceMembersApi,
inviteWorkspaceMember as inviteWorkspaceMemberApi,
setPasswordWorkspaceMember as setPasswordWorkspaceMemberApi,
} from "../../helpers/fakebackend_helper";
export const getWorkspaceMembers = createAsyncThunk(
"workspaceMembers/getWorkspaceMembers",
async (workspaceId) => {
try {
const response = await getWorkspaceMembersApi(workspaceId);
return response;
} catch (error) {
console.log("error inside getting workspace members thunk", error);
}
}
);
Подробнее здесь: [url]https://stackoverflow.com/questions/79388135/how-to-dispatch-same-action-inside-axios-interceptor-after-making-new-api-call-t[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия