簡體   English   中英

在帶有導出的自定義 Axios 服務中使用 React Hook

[英]Using react hook in custom Axios service with export

我有一個創建的 useAxiosPrivate 掛鈎,我想在我使用 axios 創建的服務 function 中使用它,我用來導出不同的方法。 但由於它不是功能性組件或 class 組件,我得到一個錯誤 react hooks must be called in a react function component or a custom react hook function

使用AxiosPrivate.tsx

import { axiosPrivate } from '../api/axios'
import { useEffect } from 'react'
import useRefreshToken from './useRefreshToken'
import useAuth from './useAuth'

const useAxiosPrivate = () => {
  const refresh = useRefreshToken()
  const { auth }: any = useAuth()

  useEffect(() => {
    const requestIntercept = axiosPrivate.interceptors.request.use(
      (config) => {
        config.headers = config.headers ?? {}
        if (!config.headers['Authorization']) {
          config.headers['Authorization'] = `Bearer ${auth?.accessToken}`
        }
        return config
      },
      (error) => Promise.reject(error),
    )

    const responseIntercept = axiosPrivate.interceptors.response.use(
      (response) => response,
      async (error) => {
        const prevRequest = error?.config
        if (
          (error?.response?.status === 403 || error?.response?.status === 401) &&
          !prevRequest?.sent
        ) {
          prevRequest.sent = true
          const newAccessToken = await refresh()
          prevRequest.headers['Authorization'] = `Bearer ${newAccessToken}`
          return axiosPrivate(prevRequest)
        }
        return Promise.reject(error)
      },
    )

    return () => {
      axiosPrivate.interceptors.request.eject(requestIntercept)
      axiosPrivate.interceptors.response.eject(responseIntercept)
    }
  }, [auth, refresh])

  return axiosPrivate
}

export default useAxiosPrivate

我想在 auth.service.tsx 中使用它

import useAxiosPrivate from "../hooks/useAxiosPrivate"

const axiosPrivate = useAxiosPrivate();  <-- 'I want to use this in this'

export const SharedService {
     

     UpdateProfile: async (firstName:string, lastName:string) => {
         const response = await axiosPrivate.put('/user/me',{
         firstName,
         lastName,
     })


}

我收到錯誤消息,指出應在頂層或功能組件內部使用掛鈎或 class 我該如何解決?

您的服務也必須是一個鈎子,以便它可以使用其他鈎子

import useAxiosPrivate from "../hooks/useAxiosPrivate";

export const useSharedService = () => {
  const axiosPrivate = useAxiosPrivate();
  return {
    UpdateProfile: async (firstName: string, lastName: string) => {
      const response = await axiosPrivate.put("/user/me", {
        firstName,
        lastName,
      });
    },
  };
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM