created: 2023-07-26T06:49:40.075Z

axios.get の戻り値と例外 (成功時と失敗時に使えるデータ)

axios/axios 21a5ad34c4a5956d81d338059ac0dd34a19ed094 の時点のコードで調べたことをメモ。

型定義

export interface AxiosResponse<T = any, D = any> {
  data: T;
  status: number;
  statusText: string;
  headers: RawAxiosResponseHeaders | AxiosResponseHeaders;
  config: InternalAxiosRequestConfig<D>;
  request?: any;
}

AxiosError の定義はこちら。

export class AxiosError<T = unknown, D = any> extends Error {
  constructor(
      message?: string,
      code?: string,
      config?: InternalAxiosRequestConfig<D>,
      request?: any,
      response?: AxiosResponse<T, D>
  );

  config?: InternalAxiosRequestConfig<D>;
  code?: string;
  request?: any;
  response?: AxiosResponse<T, D>;
  isAxiosError: boolean;
  status?: number;
  toJSON: () => object;
  cause?: Error;
  static from<T = unknown, D = any>(
    error: Error | unknown,
    code?: string,
    config?: InternalAxiosRequestConfig<D>,
    request?: any,
    response?: AxiosResponse<T, D>,
    customProps?: object,
): AxiosError<T, D>;
  static readonly ERR_FR_TOO_MANY_REDIRECTS = "ERR_FR_TOO_MANY_REDIRECTS";
  static readonly ERR_BAD_OPTION_VALUE = "ERR_BAD_OPTION_VALUE";
  static readonly ERR_BAD_OPTION = "ERR_BAD_OPTION";
  static readonly ERR_NETWORK = "ERR_NETWORK";
  static readonly ERR_DEPRECATED = "ERR_DEPRECATED";
  static readonly ERR_BAD_RESPONSE = "ERR_BAD_RESPONSE";
  static readonly ERR_BAD_REQUEST = "ERR_BAD_REQUEST";
  static readonly ERR_NOT_SUPPORT = "ERR_NOT_SUPPORT";
  static readonly ERR_INVALID_URL = "ERR_INVALID_URL";
  static readonly ERR_CANCELED = "ERR_CANCELED";
  static readonly ECONNABORTED = "ECONNABORTED";
  static readonly ETIMEDOUT = "ETIMEDOUT";
}

メモ

  • 失敗時の方が情報が豊富
    • 幸福な家庭はどれも似たものだが、不幸な家庭はいずれもそれぞれに不幸なものである トルスルイ
  • 成功時は status で状況を確認するが、失敗時は code で確認する
    • または AxiosError.response.status
  • AxiosError#isAxiosError は型ガードにならないのであんまり使わなさそう
    • if (error instanceof AxiosError) {... で判定すると型ガードになる

その他

実際に error オブジェクトから読み取れるのはこんなデータ。

try {
  await cli.get("http://httpbin.org/delay/10", {timeout: 0}) && fail();
} catch (e: unknown) {
  if (e instanceof AxiosError) {
    console.log(JSON.stringify(e.toJSON(), null, 2))
  }
}
{
  "code": "ERR_CANCELED",
  "message": "cancelTimeout 11000ms exceeded",
  "name": "CanceledError",
  "status": null,
  "stack": "CanceledError: cancelTimeout 11000ms exceeded\n    at Object.cancel (/Users/username/.ghq/github.com/username//node_modules/axios/lib/cancel/CancelToken.js:60:22)\n    at Timeout._onTimeout (/Users/username/.ghq/github.com/username//src/http.ts:64:19)\n    at listOnTimeout (node:internal/timers:564:17)\n    at processTimers (node:internal/timers:507:7)"
}
  • axios は read timeout のみ扱えるので、httpbin だと ECONNABORTED ではなく ERR_CANCELED が返される
  • connction timeout も扱いたい場合には現在は AbortController などを使う必要がある。これは node v15 から利用できる。
サイバーセキュリティの教科書
[ad] サイバーセキュリティの教科書
Thomas Kranz, Smoky (単行本(ソフトカバー))