🎅

AxiosからだとHeaders要素にアクセスできるものが限られる

2023/12/24に公開

APIから何かをfetchしたいときに、そのbodyだけではなくheadersにアクセスしたいことはよくあるかと思います。

一番よくある例はContent-Typeとかですよね
他にもContent-Lengthなんかもローディング状況を計算するときなんかに使ったりします

今回は、APIのレスポンスが返される時間であるDateを取得しようとしました。が、その時につまづきまくったので、その内容を書いていこうと思います 😱

Access-Control-Expose-Headersをレスポンスのヘッダーにつけないとブラウザからアクセスできない

MDNの記事にもあるように、Access-Control-Expose-Headersをつけないと、JavaScriptからそもそもHeadresの要素のアクセスできないことがわかりました。指定しないとデフォルト(Content-Typeとか)しかアクセスできないようです。今回はAccess-Control-Expose-Headersにはワイルドカードを指定しました。
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Expose-Headers

この時は、標準のfetchを使っている場合は問題なくheadersにアクセスすることができます。

sample
fetch('hogehoge')
  .then((res) => console.log(res.headers.get('Date'))); //headersのdateが取れる

しかし、axiosだとこれがうまくいかない

fetchだったらうまくいったからaxiosでもうまく行くやろ!と思った矢先、axiosだと全然うまくいかない、、、

sample
axios.get('hogehoge')
  .then((res) => {
    console.log(res.headers['content-type']); // 取れる 😊
    console.log(res.headers['date']); // 取れない 🤮
  })

なんでぇ、、、

axiosの実装コードを見ると、Headersの実装の中にそれっぽいやつが、、、

https://github.com/axios/axios/blob/v1.x/lib/core/AxiosHeaders.js#L283

axios側でアクセスできるやつはこれだよと指定しているみたいですね、、、

なので、axiosからheadersを色々触ろうとするのはやめて、APIレスポンスに含めてもらうようにするのが一番の解決策ですね。そもそもあまり触るべきではなさそうなので、ごにょごにょいじるのもあまりよくないかなと

stackoverflowでも同じような会話がされていそうでした。
https://stackoverflow.com/questions/37897523/axios-get-access-to-response-header-fields

もしかしたらワイルドカードではなく、ちゃんと指定してあげればいけるのかも?
この辺りはaxiosの実装をちゃんと見ないとなんとも言えないですね、時間がなくそこまでは試せず、、、
また時間がある時に試してみるかもしれないです🙇‍♂️

Discussion