Axiosのhttpエラーからステータスコードを取得するにはどうすればよいですか?


201

これは馬鹿げているように見えるかもしれませんが、Axiosでリクエストが失敗したときにエラーデータを取得しようとしています。

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log(error) //Logs a string: Error: Request failed with status code 404
    })

文字列の代わりに、おそらくステータスコードとコンテンツを含むオブジェクトを取得することは可能ですか?例えば:

Object = {status: 404, reason: 'Not found', body: '404 Not found'}

回答:


362

表示されてtoStringいるのは、errorオブジェクトのメソッドによって返された文字列です。(errorは文字列ではありません。)

サーバーから応答を受け取った場合、errorオブジェクトには次のresponseプロパティが含まれます。

axios.get('/foo')
  .catch(function (error) {
    if (error.response) {
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    }
  });

9
responseプロパティを参照しない場合、自動的に文字列に変換される背後にある魔法を説明できますか?
セバスチャンオルセン

7
console.logtoStringメソッドを使用してErrorオブジェクトをフォーマットします。responseプロパティの参照とは関係ありません 。
Nick Uraltsev 16

2
私はまだ混乱しています、これはエラーオブジェクトに固有ですか?オブジェクトをconsole.logすると、文字列ではなくオブジェクトを取得します。
セバスチャンオルセン

3
それは実装に依存します。たとえば、node.jsの実装でconsole.log は、 Errorオブジェクトを特殊なケースとして扱います。私は、それがブラウザに実装されています正確にどのように言うことはできませんが、あなたが呼び出す場合console.log({ foo: 'bar' });console.log(new Error('foo'));クロームデベロッパーツールコンソールで、あなたは結果が異なって見えることがわかります。
Nick Uraltsev 16

5
その時、ネイティブである必要があります。それはまだ奇妙です。
セバスチャンオルセン

17

@Nickが言ったようにconsole.log、JavaScript Errorオブジェクトを実行したときに表示される結果は、の正確な実装に依存しますconsole.log。これはさまざまであり、(imo)エラーのチェックが非常に煩わしくなります。

完全なErrorオブジェクトと、オブジェクトが持つすべての情報を、toString()メソッドをバイパスして表示したい場合は、JSON.stringifyを使用できます

axios.get('/foo')
  .catch(function (error) {
    console.log(JSON.stringify(error))
  });

8

このインターセプターを使用してエラー応答を取得しています。

const HttpClient = axios.create({
  baseURL: env.baseUrl,
});

HttpClient.interceptors.response.use((response) => {
  return response;
}, (error) => {
  return Promise.resolve({ error });
});

6

TypeScriptを使用すると、適切なタイプで必要なものを簡単に見つけることができます。

import { AxiosResponse, AxiosError } from 'axios'

axios.get('foo.com')
  .then(response: AxiosResponse => {
    // Handle response
  })
  .catch((reason: AxiosError) => {
    if (reason.response!.status === 400) {
      // Handle 400
    } else {
      // Handle else
    }
    console.log(reason.message)
  })

2

スプレッド演算子(...)を使用して、次のような新しいオブジェクトに強制できます。

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({...error}) 
})

注意:これはエラーのインスタンスではありません。



1

validateStatusリクエスト設定で呼び出される新しいオプションがあります。これを使用して、ステータス<100またはステータス> 300(デフォルトの動作)の場合に例外をスローしないように指定できます。例:

const {status} = axios.get('foo.com', {validateStatus: () => true})

0

次のように、エラーをオブジェクトに入れてオブジェクトをログに記録できます。

axios.get('foo.com')
    .then((response) => {})
    .catch((error) => {
        console.log({error}) // this will log an empty object with an error property
    });

これが誰かを助けることを願っています。


0

サーバーから返されるhttpステータスコードを取得するために、validateStatus: status => trueaxiosオプションに追加できます。

axios({
    method: 'POST',
    url: 'http://localhost:3001/users/login',
    data: { username, password },
    validateStatus: () => true
}).then(res => {
    console.log(res.status);
});

このように、すべてのhttp応答は、axiosから返されたpromiseを解決します。

https://github.com/axios/axios#handling-errors

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.