Axios: 再試行パラメータの追加

作成日 2015年11月27日  ·  23コメント  ·  ソース: axios/axios

時々 ECONNRESET返すAPIが1つあります。 だから私はそのようなエラーで再試行したいと思います。 このライブラリにretry機能を追加する予定はありますか?

最も参考になるコメント

@mericsson再試行するときに、指数バックオフが必要です。 私は素晴らしい働きをする以下をまとめました。 これは現在すべてのエラーをインターセプトして再試行するだけなので、特定のエラー/ステータスコードのチェックを追加したいと思います。

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

使用するには:

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

構成オプション:
retry -最初にリクエストが失敗した後にリクエストを再試行する回数。
retryDelay -失敗したリクエストの間に待機するミリ秒数(デフォルトは1)。

ある時点で、要点でこれをもう少し構成可能にするかもしれません。

全てのコメント23件

これに関する更新はありますか?

これはとても重要だと思います。 シナリオは、モバイルWeb用にAxiosを実装し、ユーザーがインターネットソースをWiFiから任意の種類のモバイル接続に切り替える場合です。

この種の機能はこのライブラリにあるべきではないと思います。 これが必要な場合は、このためのインターセプターを作成できます。

@jtangelderそれはどのように見えるべきですか?

function retryFailedRequest (err) {
  if (err.status === 500 && err.config && !err.config.__isRetryRequest) {
    err.config.__isRetryRequest = true;
    return axios(err.config);
  }
  throw err;
}
axios.interceptors.response.use(undefined, retryFailedRequest);

このようなもの! 500エラーを1回再試行します。

これはコアライブラリに属していないという@jtangelderに同意します。 これは、図に示すように、インターセプターの優れたユースケースです。

@jtangelder @mzabriskieありがとう! 実際、これはドキュメントの優れた例でもあります

+1この例が見つけやすくなればいいのにと思います。

@jtangelderスニペットを

スニペットを少し修正すると、返されるエラーステータスは500ではなく504になるはずです。

@jtangelder非常に役立つ例。

指数バックオフで何かをする方法について何かアイデアはありますか? retryFailedRequestからプロミスを返すことは可能ですか? または他の提案? ありがとう!

@jtangelderの例は、クックブックページに含める必要があります

これで、 axios-retryを使用できます。

同意します。 これは実際にはライブラリの一部であるか、少なくともより適切に文書化されている必要があります。

@mericsson再試行するときに、指数バックオフが必要です。 私は素晴らしい働きをする以下をまとめました。 これは現在すべてのエラーをインターセプトして再試行するだけなので、特定のエラー/ステータスコードのチェックを追加したいと思います。

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

使用するには:

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

構成オプション:
retry -最初にリクエストが失敗した後にリクエストを再試行する回数。
retryDelay -失敗したリクエストの間に待機するミリ秒数(デフォルトは1)。

ある時点で、要点でこれをもう少し構成可能にするかもしれません。

@KyleRossコードをありがとう、再試行が指数関数的になるように調整しました

// Create new promise to handle exponential backoff. formula (2^c - 1 / 2) * 1000(for mS to seconds)
    const backOffDelay = config.retryDelay 
        ? ( (1/2) * (Math.pow(2, config.__retryCount) - 1) ) * 1000
        : 1;

    const backoff = new Promise((resolve) => {
        setTimeout(() => {
            resolve();
        },  backOffDelay);
    });

@KyleRoss共有していただきありがとうございます。

遅延はますます設定できます。

const RETRY_TIMEOUTS = [1, 3, 5, 10]; // seconds
const delay = RETRY_TIMEOUTS[config.retryCount] * 1000;

4xxまたは5xxリクエストを再試行する場合は、次のようなエラーオブジェクトを操作する必要があります。

リクエストを傍受するには:

axios.interceptors.request.use(function (config) {
    // Do something before request is sent
    return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

応答を傍受するには:

axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  });

素晴らしいアイデア。 人々が興味を持っているなら、私はこれのかなりの部分をnpmモジュールにまとめました:
https://github.com/JustinBeckwith/retry-axios

機能のリクエストを喜んで承ります✨

axios-retry vs retry-axios

@KyleRoss再試行およびretryDelay構成オプションをAxiosRequestConfigに追加しようとしましたが、それらが存在するようには見えません。 どうやってそれを機能させたのですか?

@lawloretienne再試行パラメーターを使用する前に、私の例のコードを必ず追加する必要があります。 プラグインのように機能するため、新しいプロパティはaxios自体の一部として文書化されていません。

config.__retryCount = config.__retryCount || 0;

@KyleRoss configconfigを渡すことができません。各 'config .__ reyCount'は未定義です。
https://github.com/axios/axios/blob/v0.19.0/lib/core/mergeConfig.js
カスタムプロパティが除外されるようになりました。

@dennisreimannカスタム設定がv0.19で除外されるようになり、次のように設定を渡すことができるようになりました。

axios.defaults.headers.common['retry'] = 3
axios.defaults.headers.common['retryDelay'] = 1000
axios.defaults.headers.common['retryCount'] = 0

@mericsson再試行するときに、指数バックオフが必要です。 私は素晴らしい働きをする以下をまとめました。 これは現在すべてのエラーをインターセプトして再試行するだけなので、特定のエラー/ステータスコードのチェックを追加したいと思います。

axios.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;
    // If config does not exist or the retry option is not set, reject
    if(!config || !config.retry) return Promise.reject(err);

    // Set the variable for keeping track of the retry count
    config.__retryCount = config.__retryCount || 0;

    // Check if we've maxed out the total number of retries
    if(config.__retryCount >= config.retry) {
        // Reject with the error
        return Promise.reject(err);
    }

    // Increase the retry count
    config.__retryCount += 1;

    // Create new promise to handle exponential backoff
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    // Return the promise in which recalls axios to retry the request
    return backoff.then(function() {
        return axios(config);
    });
});

使用するには:

axios.get('/some/endpoint', { retry: 5, retryDelay: 1000 })
    .then(function(res) {
        console.log('success', res.data);
    })
    .catch(function(err) {
        console.log('failed', err);
    });

構成オプション:
retry -最初にリクエストが失敗した後にリクエストを再試行する回数。
retryDelay -失敗したリクエストの間に待機するミリ秒数(デフォルトは1)。

ある時点で、要点でこれをもう少し構成可能にするかもしれません。

手伝ってくれてありがとう!

このページは役に立ちましたか?
0 / 5 - 0 評価