Axios: Apakah mungkin untuk menambahkan metode coba lagi ke axios?

Dibuat pada 2 Jun 2017  ·  12Komentar  ·  Sumber: axios/axios

Di pencegat saya, saya ingin menangkap kesalahan tertentu (katakanlah, token kedaluwarsa)

Dan kemudian saya akan menjalankan beberapa metode untuk menyegarkan token.

Setelah itu diselesaikan, saya ingin axios mencoba lagi permintaan sebelumnya (dengan handler hasil yang sama).

Apakah saya perlu menerapkan logika ini secara manual? Atau adakah percobaan ulang atau yang serupa yang memungkinkan saya melakukannya secara langsung?

Terima kasih

Komentar yang paling membantu

Anda dapat melakukannya dengan pencegat yang menangani kesalahan otentikasi. Sesuatu seperti:

axios.interceptors.response.use(null, (error) => {
  if (error.config && error.response && error.response.status === 401) {
    return updateToken().then((token) => {
      error.config.headers.xxxx <= set the token
      return axios.request(config);
    });
  }

  return Promise.reject(error);
});

Semua 12 komentar

Anda dapat melakukannya dengan pencegat yang menangani kesalahan otentikasi. Sesuatu seperti:

axios.interceptors.response.use(null, (error) => {
  if (error.config && error.response && error.response.status === 401) {
    return updateToken().then((token) => {
      error.config.headers.xxxx <= set the token
      return axios.request(config);
    });
  }

  return Promise.reject(error);
});

Saat menggunakannya saya mendapatkan "config tidak terdefinisi". Dari mana saya harus mendapatkannya?

@mmsmsy Baris ini:

return axios.request(config);

seharusnya:

return axios.request(error.config);

Hati-hati jika Anda menggunakan opsi transformRequest : data dari error.config sudah diubah menjadi string.

Misalnya, kode dari @rubennorte akan mogok dengan pengaturan ini:

// Lets use qs to stringify our request.
this.$axios = axios.create({
  transformRequest: [
    data => qs.stringify(data),
  ],
});

this.$axios.interceptors.response.use(null, (error) => {
  if (error.config && error.response && error.response.status === 401) {
    return updateToken().then((token) => {
      error.config.headers.xxxx <= set the token
      // Here, the request data will be double stringified with qs.stringify,
      // potentially leading to 422 responses or similar.
      return this.$axios.request(config);
    });
  }

  return Promise.reject(error);
});

Solusi untuk masalah ini adalah tidak mengubah data permintaan jika sudah berupa string. Sebagai contoh:

this.$axios = axios.create({
  transformRequest: [
    data => (isString(data) ? data : qs.stringify(data)),
  ],
});

@skyrpex Terima kasih banyak! Jawaban Anda membawa kami ke jalur yang benar dalam perburuan serangga yang panjang dan rumit!

Tampaknya transformRequest default menangani transformasi seperti pada contoh Anda, tetapi axios memperhatikan bahwa data adalah string dan akan menyetel tipe konten ke text/plain alih-alih application/json yang dalam kasus kami mengarah ke pengiriman API kami kembali kesalahan 400.

Ini adalah bug yang sulit ditangkap!

remhume bisakah kau membantuku? Saya mengalami masalah dengan perilaku salah yang sama dengan yang Anda miliki di program Anda.

iirc kami hanya secara manual mengatur jenis konten ke yang benar (dalam kasus kami application/json ), yang menyelesaikannya.

Terima kasih atas jawabannya, saya sudah menemukan solusi lain untuk menyelesaikan masalah saya
masalah. Salam

Pada Sabtu, 28 Juli 2018 pukul 18:19, remmy hume [email protected]
menulis:

iirc kami hanya secara manual mengatur jenis konten ke yang benar (dalam kasus kami
application/json), yang menyelesaikannya.


Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/axios/axios/issues/934#issuecomment-408638600 , atau bisu
benang
https://github.com/notifications/unsubscribe-auth/AVqsr8akXZIWUoLgfSmk7X9f2FwLirA2ks5uLOONgaJpZM4Nu1Oc
.

Anda dapat melakukannya dengan pencegat yang menangani kesalahan otentikasi. Sesuatu seperti:

axios.interceptors.response.use(null, (error) => {
  if (error.config && error.response && error.response.status === 401) {
    return updateToken().then((token) => {
      error.config.headers.xxxx <= set the token
      return axios.request(config);
    });
  }

  return Promise.reject(error);
});

Jika saya memiliki 10 permintaan paralel, axios mengirim 10 permintaan updateToken.
Itu dapat menyebabkan kesalahan "ECONNRESET".
Mungkin Anda punya solusi untuk kasus ini?

PS temukan solusinya di sini https://Gist.github.com/mkjiau/650013a99c341c9f23ca00ccb213db1c

@akhrabrov Saya membuat paket sederhana jika Anda ingin menggunakannya -> axios-auth-refresh . Saya akan sangat senang melihat kontribusinya jika Anda kehilangan beberapa fungsi.

Saya ingin melakukan sesuatu yang serupa, kecuali tidak harus dengan otentikasi, dan terus mencoba lagi setelah penundaan ketika kode status tertentu diterima. Pada dasarnya polling melalui pencegat Axios. Ini adalah solusi saya:

import axios from 'axios';

const instance = axios.create({
    baseURL: 'http://localhost:5000'
});

const sleepRequest = (milliseconds, originalRequest) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => resolve(instance(originalRequest)), milliseconds);
    });
};

instance.interceptors.response.use(response => {
    return response;
}, error => {
    const { config, response: { status }} = error;
    const originalRequest = config;

    if (status === 420) {
        return sleepRequest(1000, originalRequest);
    } else {
        return Promise.reject(error);
    }
});

export default instance;

https://Gist.github.com/edmondburnett/38ed3451de659dc43fa3f24befc0073b

Anda juga harus menggunakan kode di bawah ini untuk mencegah crash dalam permintaan posting:
if(error.config.data) error.config.data = JSON.parse(error.config.data)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat