我在我的React应用中的许多脚本中都使用import axios from 'axios
来使用axios。我想使用一种针对所有axios调用/错误调用的中间件。我该如何处理?
答案 0 :(得分:2)
作为文档- 您需要创建一个文件,即
// axios.js
import axios from 'axios';
// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
console.log(config);
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Do something with response data
return response;
}, function (error) {
// Do something with response error
return Promise.reject(error);
});
export default axios;
// ***在其他文件上导入此-
// Home.js
import axios from './axios.js';
答案 1 :(得分:0)
拦截器是Axios的方法。但是对我来说,它太有限了,与Axios的API纠结,难以测试,等等。
因此,我编写了axios-middleware模块,这是一个简单的中间件服务,可将其自身挂接到axios实例(全局或本地实例)中,并提供简单,独立且易于测试的中间件API。
注意::它在较大的应用程序中很有用,在这些应用程序中,最小耦合确实很重要。
这里是simple example from the 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));
它应该输出:
Ready to fetch. onRequest onSync onResponse Received: {userId: 1, id: 1, title: ...
假设我们要测试以下独立的中间件类。
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;
}
}
那真的很容易,我们甚至不需要模拟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');
});
});