首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redux-Toolkit查询拦截器

Redux-Toolkit查询拦截器
EN

Stack Overflow用户
提问于 2021-07-29 18:22:23
回答 2查看 4K关注 0票数 8

我正在尝试构建一个拦截器,用于在RTK查询中访问令牌变得无效的情况。我已经通过文档中的一个示例构建了它,因此它看起来如下所示:

代码语言:javascript
复制
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请求。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-29 20:14:54

除了baseQuery('token/refresh/', api, extraOptions);,您还可以执行以下操作

代码语言:javascript
复制
baseQuery({
  url: 'token/refresh/',
  method: 'POST'
}, api, extraOptions);

fetchBaseQuery的第一个参数就是您将从端点定义中的query函数返回的内容。

至于你的另一个问题,我不知道你所说的“公共”和“私有”端点到底是什么意思。调用这些查询的是您的代码,所以您应该知道何时调用哪些查询?

票数 6
EN

Stack Overflow用户

发布于 2021-09-30 09:01:36

我最近需要绕过向refreshToken请求添加auth令牌。为此,我创建了一个使用queryFn而不是query的端点:

代码语言:javascript
复制
tokenRefresh: builder.query<TokenRefreshResponse, void>({
    queryFn: async (arg, queryApi, extraOptions, baseQuery) => {
        const response = await fetch(`/api/refresh`);
        return (response.ok) ? {data: await response.json()}
                             : {error: await response.json()};
    }
}),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68581163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档