Reactで異なるオリジンのAPI叩いたら404が返ってきた時の対処法
フロントはTypeScriptとReact、バックエンドはNodeで書いていて、このサーバーはAPI用のものとしてフロントを返すサーバーとは別のもの、という構成で作っていた。
具体的には
フロントのページ返すサーバーが localhost:3000
といった感じ。
この状況でReactからaxiosを使いAPIサーバーを叩いた。
const origin = "http:/localhost:4000"; const baseUrl = `${origin}/api/v1`; // 404エラー await axios.post( `${baseUrl}/users`, { name }, );
これだと "http:/localhost:3000/localhost:4000" にリクエストが送られてしまってエラーになっていた。
対処法
package.jsonに proxy を設定する
To tell the development server to proxy any unknown requests to your API server in development, add a proxy field to your package.json
{ ... "proxy": "http://localhost:4000" }
こうした後にソースコードも変更
const baseUrl = `/api/v1`; await axios.post( `${baseUrl}/users`, { name }, );
いったんフロント返す側のサーバダウンさせてタブも消す。その後再び yarn start で立ち上げたら無事叩けるようになった。
なぜaixosでURLを指定しても "http:/localhost:3000/localhost:4000/~" にリクエストされてしまったのか具体的な部分は不明。
ReactNativeではエラー出なかったのでReactの設定だとは思う。