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) {...
で判定すると型ガードになる
その他
timeout
オプションでエラーになった場合はAxiosError#code
はETIMEDOUT
ではなくECONNABORTED
cancelToken
を使ってキャンセルする場合のAxiosError#code
はERR_CANCELED
- ただしこれは現在非推奨 Cancellation | Axios Docs
例
実際に 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 から利用できる。