実現したいこと
access tokenがグローバルステートに保存されている場合に、axiosのinterceptors.requestを使ってHTTPリクエストのヘッダーにaccess tokenを埋め込みたい。
現状では、useRecoilValueを使って保存されたaccess tokenの値を呼び出しそれをinterceptors.requestを使ってヘッダーに埋め込もうとしているが、関数コンポーネント、カスタムフック外でフックを使ってしまっているためエラーが発生してしまっている。
前提
バックエンド側をRails、フロント側をReactを使ってSPA構成でアプリを作成しています。
ログインフォーム送信後にaccess tokenがレスポンスが返ってくるので、その値をRecoilを使ってグローバルステートに保存できているところまでは確認できました。
Reactはbullet-proofというOSSを参考にしているためフォルダ構成はbullet-proofとほぼ同じです。
https://github.com/alan2207/bulletproof-react
発生している問題・エラーメッセージ
Uncaught (in promise) Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.
関数コンポーネント、カスタムフック外でuseRecoilValueを使ってしまっているのでエラー発生しているため、想定のエラーです。
該当のソースコード
HTTPリクエストヘッダーにaccess token情報を埋め込むために9-12行目を追加したところでエラー発生しています。
client/src/lib/apiClient.ts
js
1import applyCaseMiddleware from 'axios-case-converter'; 2import Axios, { AxiosRequestConfig } from 'axios'; 3 4import { API_URL } from '@/config'; 5import { useRecoilValue } from 'recoil'; 6import { authState } from '@/global_states/auth/authState'; 7 8function authRequestInterceptor(config: AxiosRequestConfig) { 9 const token = useRecoilValue(authState); 10 if (token) { 11 config.headers.authorization = `${token}`; 12 } 13 config.headers.Accept = 'application/json'; 14 config.headers = { 'X-Requested-With': 'XMLHttpRequest' }; 15 return config; 16} 17 18const options = { 19 ignoreHeaders: true 20} 21 22export const ApiClient = applyCaseMiddleware(Axios.create({ 23 withCredentials: true, 24 baseURL: API_URL, 25}), options); 26 27ApiClient.interceptors.request.use(authRequestInterceptor); 28ApiClient.interceptors.response.use( 29 (response) => response.data, 30);
試したこと
- 初めは関数コンポーネント内、カスタムフック内以外でフックが使えないということを知らず、関数内でフックを使って保存したaccess tokenの値を呼び出し、ヘッダーに埋め込もうとしましたがエラーが発生しました
- 「recoil グローバルステート axiosのヘッダー」やこれに似た検索をかけてみましたが問題解決に関連しそうな情報は出てきませんでした
フロントエンドの経験がかなり浅く、他に何を試せばいいか分からない状態が続いております。
お力添えいただければ幸いです。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
OS: macOS Ventura 13.2 (intel processor)
Docker: Docker version 20.10.21
docker-compose: Docker Compose version v2.13.0
React: 18.2.0
TypeScript: 4.9.4
axios: 1.2.1
recoil: 0.7.6
Ruby: 3.1.2
Rails: 7.0.4

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/05/08 01:19