J'utilise axios dans mon application react en utilisant import axios from 'axios
dans plusieurs de mes scripts. Je veux utiliser une sorte de middleware qui est invoqué pour tous les appels/erreurs axios. Comment puis-je aborder cela?
Les intercepteurs sont le moyen d'Axios de le faire. Mais pour moi, c'était trop limité, emmêlé dans l'API d'Axios, difficile à tester, etc.
J'ai donc écrit le module axios-middleware , un service middleware simple qui se connecte dans votre instance axios (globale ou locale) et fournit un simple, self -API middleware contenu et facilement testable.
Remarque: il brille dans les plus grandes applications où un couplage minimal est vraiment important.
Voici un exemple simple de la documentation
import axios from 'axios'; import { Service } from 'axios-middleware'; const service = new Service(axios); service.register({ onRequest(config) { console.log('onRequest'); return config; }, onSync(promise) { console.log('onSync'); return promise; }, onResponse(response) { console.log('onResponse'); return response; } }); console.log('Ready to fetch.'); // Just use axios like you would normally. axios('https://jsonplaceholder.typicode.com/posts/1') .then(({ data }) => console.log('Received:', data));
Il devrait produire:
Ready to fetch. onRequest onSync onResponse Received: {userId: 1, id: 1, title: ...
Supposons que nous ayons la classe de middleware autonome suivante que nous voulons tester.
export default class ApiErrorMiddleware {
constructor(toast) {
this.toast = toast;
}
onResponseError(err = {}) {
let errorKey = 'errors.default';
const { response } = err;
if (response && response.status) {
errorKey = `errors.${response.status}`;
} else if (err.message === 'Network Error') {
errorKey = 'errors.network-error';
}
this.toast.error(errorKey);
throw err;
}
}
Ensuite, c'est vraiment facile, nous n'avons même pas besoin de nous moquer d'Axios.
import ApiErrorMiddleware from '@/middlewares/ApiErrorMiddleware';
describe('ApiErrorMiddleware', () => {
let toast;
let middleware;
// Jest needs a function when we're expecting an error to be thrown.
function onResponseError(err) {
return () => middleware.onResponseError(err);
}
beforeEach(() => {
toast = { error: jest.fn() };
middleware = new ApiErrorMiddleware(toast);
});
it('sends a code error message', () => {
hasKey = true;
expect(onResponseError({ response: { status: 404 } })).toThrow();
expect(toast.error).toHaveBeenLastCalledWith('errors.404');
});
});