【发布时间】:2021-10-05 10:05:39
【问题描述】:
我正在尝试构建一个拦截器,以应对访问令牌因 RTK 查询而变得无效的情况。 我已经通过文档中的示例构建了它,如下所示:
const baseQuery = fetchBaseQuery({
baseUrl: BASE_URL,
prepareHeaders: (headers, { getState }) => {
const {
auth: {
user: { accessToken },
},
} = getState() as RootState;
if (accessToken) {
headers.set('authorization', `Bearer ${accessToken}`);
}
return headers;
},
});
const baseQueryWithReauth: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryError> = async (
args,
api,
extraOptions
) => {
let result = await baseQuery(args, api, extraOptions);
if (result.error && result.error.status === 401) {
const refreshResult = await baseQuery('token/refresh/', api, extraOptions);
if (refreshResult.data) {
api.dispatch(tokenUpdated({ accessToken: refreshResult.data as string }));
// retry the initial query
result = await baseQuery(args, api, extraOptions);
} else {
api.dispatch(logout());
}
}
return result;
};
export const baseApi = createApi({
reducerPath: 'baseApi',
baseQuery: baseQueryWithReauth,
endpoints: () => ({}),
});
问题是token/refresh/ 需要一个带有刷新令牌的POST 请求,我无法弄清楚如何重建这条const refreshResult = await baseQuery('token/refresh/', api, extraOptions); 行,以便它接受参数并发出POST 请求。
【问题讨论】:
-
知道如何区分对私有和公共端点的请求也很好
-
我很想知道你是如何让所有其他 api 切片从这个
baseQueryWithReauth扩展而来的 -
@Jose Bernhardt 就这样
export const yourApiName = baseApi.injectEndpoints({ endpoints: (builder) => ({}), }); -
谢谢,你知道是否有办法覆盖更多值吗? (我似乎无法在他们的文档中找到它)就像“注入”
fetchBaseQuery一样?如果您想用不同的baseUrl注入端点,这样做会非常方便。 -
@JoseBernhardt 我不确定我理解你的意思。但我认为,如果您有 2 个单独的基本 URL,则将其端点放在单独的文件中是有意义的。类似
someApi = baseApiMain.injectEndpoints和someOtherApi = baseApiSecondary.injectEndpoints
标签: reactjs redux redux-toolkit rtk-query