微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Redux-Toolkit 查询拦截器

如何解决Redux-Toolkit 查询拦截器

我正在尝试为访问令牌因 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,extraOptions);

    if (result.error && result.error.status === 401) {
        const refreshResult = await baseQuery('token/refresh/',extraOptions);

        if (refreshResult.data) {
            api.dispatch(tokenUpdated({ accesstoken: refreshResult.data as string }));

            // retry the initial query
            result = await baseQuery(args,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/',extraOptions); 以使其接受参数和发出 POST 请求。

解决方法

除了 baseQuery('token/refresh/',api,extraOptions); 你也可以这样做

baseQuery({
  url: 'token/refresh/',method: 'POST'
},extraOptions);

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。