8

RTK Queryでアクセストークンが無効になった場合のインターセプターを構築しようとしています。ドキュメントの例で作成したので、次のようになります。

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

4

2 に答える 2

6

代わりにbaseQuery('token/refresh/', api, extraOptions);あなたもできる

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

の最初の引数は、エンドポイント定義fetchBaseQueryの関数から返されるものです。query

あなたの他の質問については、「パブリック」エンドポイントと「プライベート」エンドポイントが正確に何を意味するのかわかりません。これらのクエリを呼び出すのはコードなので、どのクエリをいつ呼び出すかを知っておく必要があります。

于 2021-07-29T20:14:54.417 に答える