我在我的import axios from 'axios许多脚本中使用的 react 应用程序中使用 axios 。我想使用一种为所有 axios 调用/错误调用的中间件。我该如何处理?
用于所有 axios 实例的 axios 中间件
IT技术
reactjs
axios
middleware
                    2021-04-27 15:26:35
                
                    
                
            
        2个回答
            根据文档 - 您需要创建一个文件,即
// api-client.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 apiClient from './api-client.js';
拦截器是 Axios 执行此操作的方式。但是对我来说,它太有限了,纠结于 Axios 的 API,难以测试等等。
Axios-中间件
因此,我编写了axios-middlewaremodule,这是一个简单的中间件服务,它可以将自身挂接到您的 axios 实例(全局或本地实例)中,并提供一个简单、自包含且易于测试的中间件 API。
注意:它在最小耦合非常重要的大型应用程序中大放异彩。
简单的例子
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');
  });
});
其它你可能感兴趣的问题