ローカルストレージからトークンを取得してaxiosクライアントのリクエストヘッダに含める処理をカスタムフックで行なっているのですが、リクエストヘッダの設定処理が1回のページアクセスで200回から300回ほど行われてしまいます。
useAxios
はAPIからデータを取得する別のカスタムフックであるuseQuotes
で呼び出されています。トップレベルでuseQuotes
が呼び出されているページにアクセスすると上記の問題が生じます。
各hooksの実行回数を調べてみたのですが、useAxios
もuseQuotes
も数回しか呼び出されていないにも関わらず、トークン設定処理だけが過剰な回数行われているようです。
原因が思い浮かばず質問させていただきました。分かる方いらっしゃいましたらアドバイスを頂けると助かります。
typescript
1// useAxios.ts 2import axios, { AxiosError, AxiosResponse } from "axios"; 3import { useAuthMethods } from "./useAuthMethods"; 4 5export const useAxios = () => { 6 const { signout } = useAuthMethods(); 7 8 console.log("useAxios"); // 数回 9 10 axios.defaults.baseURL = process.env.NEXT_PUBLIC_API_BASE_URL; 11 12 axios.interceptors.request.use((config) => { 13 const token = localStorage.getItem("token"); 14 console.log(token); // 200から300回 15 config.headers = Object.assign( 16 { Authorization: `Bearer ${token}` }, 17 config.headers 18 ); 19 return config; 20 }); 21 22 const onSuccess = (response: AxiosResponse<any>) => response; 23 const onError = (error: AxiosError) => { 24 switch (error.response?.status) { 25 case 401: 26 signout(); 27 return; 28 } 29 }; 30 axios.interceptors.response.use(onSuccess, onError); 31 32 return { customAxios: axios }; 33}; 34
typescript
1// useQuotes.ts 2import { useContext, useState } from "react"; 3import { QuotesContext } from "../context/QuotesContext"; 4import { useAxios } from "./useAxios"; 5import { useEffectAsync } from "./useEffectAsync"; 6 7export const useQuotes = (tags: string[]) => { 8 console.log("useQuotes"); 9 const { quotes, setQuotes } = useContext(QuotesContext); 10 const [loading, setLoading] = useState<boolean>(false); 11 const { customAxios } = useAxios(); 12 13 useEffectAsync(async () => { 14 setLoading(true); 15 const url = "..." 16 const response = await customAxios.get(url); 17 if (response?.data) { 18 setQuotes(response.data); 19 } 20 setLoading(false); 21 }, [tags]); 22 23 return { quotes, loading }; 24}; 25
typescript
1// index.tsx 2interface Props { 3 registeredTags: string[]; 4} 5 6const Index: NextPage<Props> = ({ registeredTags }) => { 7 const [addedTags, setAddedTags] = useState<string[]>([]); 8 const { quotes, loading } = useQuotes(addedTags); 9 const { user, loading: userLoading } = useAuth(); 10 11 console.log("index"); 12 13 useEffect(() => { 14 if (!user && !userLoading) { 15 router.push("/login"); 16 } 17 return; 18 }, [user, userLoading]); 19 20 (略) 21 22 return ( 23 <> 24 25 (略) 26 27 </> 28 ); 29}; 30 31 32export default Index; 33
typescript
1// useEffectAsync.ts 2import { useEffect, DependencyList } from "react"; 3 4export const useEffectAsync = (effect: () => any, deps?: DependencyList) => { 5 useEffect(() => { 6 effect(); 7 }, deps); 8}; 9
結果
typescript
1 const instance = axios.create({ 2 baseURL: process.env.NEXT_PUBLIC_API_BASE_URL, 3 }); 4 5 instance.interceptors.request.use((config) => { 6 const token = localStorage.getItem("token"); 7 config.headers = Object.assign( 8 { Authorization: `Bearer ${token}` }, 9 config.headers 10 ); 11 return config; 12 });
上のようにaxiosインスタンスに関数を登録するように変更したところ、異常な関数実行はなくなりました。
回答1件
あなたの回答
tips
プレビュー