0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

axios: Network Errorでハマった話

Last updated at Posted at 2025-07-19

axios: Network Errorでフロントとバックの接続にハマってしまったが解消できたので備忘録として

エラー概要

想定の挙動にならずDevtoolのコンソールにAxiosError: Network Errorが発生

Access to XMLHttpRequest ... has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header

結論

IPv4ではなくIPv6に接続されていて Flask (バックエンド)につながっていなかった

検証内容

該当リクエストでレスポンス403が返ってきてしまう状態だったのでコマンドラインで以下を実行

  1. Flaskがバインドしているか明示

    curl -i http://localhost:5000/...
    

    出力結果: レスポンス: 403 Serverヘッダ: AirTunes/ ← Flaskに届いてない

  2. localhostの接続先を確認

    curl -i http://127.0.0.1:5000/...
    

    出力結果: レスポンス: 200 + JSON Serverヘッダ: Werkzeug/ ← Flaskに届いている

  3. 強制的にIPv4で接続し検証

    curl -4 -i http://localhost:5000/...
    

    出力結果: レスポンス: 200 Serverヘッダ: Werkzeug/ ← Flaskに届いた!

  4. 強制的にIPv4で接続し検証

    curl -6 -i http://localhost:5000/...
    

    出力結果: レスポンス: 403 Serverヘッダ: AirTunes/ ← Flaskに届いてない

    追加観測 (lsof) 以下コマンドを実行

    lsof -nP -iTCP:5000
    

    出力結果

    ControlCe ... TCP *:5000 (LISTEN)
    Python    ... TCP 127.0.0.1:5000 (LISTEN)
    

    ControlCe (macOS Control Center / AirPlay Receiver) が ポート5000を IPv6 / ワイルドカードで掴んでいる 一方、
    Flask(Werkzeug) は IPv4 の 127.0.0.1 のみ で LISTEN → localhost (IPv6優先解決) が AirPlay に流れる。

原因

ブラウザは http://localhost:5000 へアクセスする際、OS の名前解決結果のうち IPv6 (::1) を優先していた
その IPv6:5000 を macOS AirPlay Receiver (Control Center) が LISTEN → 403 を返し、CORS ヘッダも当然付かない
Axios は 403 + CORS ヘッダ欠如を "Network Error" として報告(内部ではレスポンスが来ている)
Flask は 127.0.0.1:5000 (IPv4) には存在するため、直接 127.0.0.1 指定すれば成功する
つまり “サーバが壊れていた” のではなく、“名前 (localhost) が IPv6 で別プロセスを指していた” ことが本質。

解決策

vite.config.jsのtargetを直接差し替え

export default defineConfig({
  plugins: [vue()],
  server: {
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:5000',
        changeOrigin: true,
        secure: false,
      }
    }
  }
})

実際に行った手順(時系列)

1.Console で CORS エラー確認

2.Network タブで 403 / ヘッダに Server: AirTunes を発見

3.curl で localhost が 403 / 127.0.0.1 が 200 の差異を確認

4.lsof で ControlCenter 系プロセスが 5000 LISTEN を確認

5.暫定対応として axios baseURL を http://127.0.0.1:5000 に固定 → 直後に成功

6.追加で curl -4 / curl -6 で IPv4/IPv6 差異を再現し記録

7.再発防止策(proxy 導入候補 / ポート変更)

発生時のチェックリスト

[1] Console / Network でステータス確認 (403? CORS 文言?)
[2] curl -i http://localhost:5000/IncomeByYear
[3] curl -i http://127.0.0.1:5000/IncomeByYear
[4] curl -4 / curl -6 で差が出るか
[5] lsof -nP -iTCP:5000 | grep LISTEN
[6] Server ヘッダ: AirTunes? Werkzeug?
[7] 必要なら IPv4 固定 / 別ポート / Proxy を適用
[8] 直ったら手順を docs に追記

まとめ

本件のlocalhost 403 (AirTunes) 問題は “CORS 設定不足” ではなく “IPv6 で別サービスに到達” が原因。 → IPv4 指定 / ポート変更 / Proxy で即解決、再発時はヘッダと lsof を見る。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?