Skip to content

@142vip/egg-axios

NPM version

Egg.js框架下使用@142vip/axios的插件,简化Http请求配置

安装

bash
# npm
npm i @142vip/axios
# pnpm
pnpm i @142vip/egg-axios

配置

单实例

js
// config/config.xxx.js
module.exports = {
  axios: {
    client: {
      headers: {
        common: {
          'Content-Type': 'application/json; charset=UTF-8',
        },
      },
      timeout: 6000,
    },
  }
}

多个实例

js
// config/config.xxx.js
module.exports = {
  axios: {
    clients: {
      axios1: {
        headers: {
          common: {
            'Content-Type': 'application/json; charset=UTF-8',
          },
        },
        timeout: 7000,
        instanceName: 'axios1',
      },
      axios2: {
        headers: {
          common: {
            'Content-Type': 'application/json; charset=UTF-8',
          },
        },
        timeout: 8000,
        instanceName: 'axios2',
      },
    },
    // 所有实例的默认配置,可选
    default: {
      timeout: 5000,
    },
  }
}

使用

plugin.js文件中,加载@142vip/egg-axios插件:

js
// config/plugin.js
module.exports = {
  axios: {
    enable: true,
    package: '@142vip/egg-axios',
  },
}

使用egg-axios插件时,会在app上挂载axios对象,该对象除了提供自带的构造函数、方法外,还另外挂载了三个方法:

  • getInstance: (name?: string) => T | undefined
  • getInstances: () => Record<string, T>
  • getInstanceNames: () => string[]
ts
export interface EggPluginInstance<T> {
  /**
   * 获取实例对象
   * @param name 实例名称
   * - 多实例,默认获取第一个实例
   * @returns 实例
   */
  getInstance: (name?: string) => T | undefined
  /**
   * 获取所有实例
   * - 默认实例和单实例,对象中对应Key为`default`
   * - 多实例,对象中对应Key为实例名称
   * @returns 所有实例配置key与实例对象组成的键值对
   */
  getInstances: () => Record<string, T>
  /**
   * 获取所有实例名称
   * - 默认实例和单实例,返回: ['default']
   * - 多实例,返回: 实例名称数组,例如: ['axios1','axios2']
   * @returns 所有实例名称
   */
  getInstanceNames: () => string[]
}

默认实例

egg项目中,如果只加载了@142vip/egg-axios插件,没有在config.xx.js配置文件中增加axios关键字配置,会加载插件默认配置:

js
const { defaultRequestInterceptor, defaultResponseInterceptor } = require('@142vip/axios')
const { defaultPluginConfig } = require('@142vip/egg')
const { name: pkgName } = require('../package.json')

module.exports = {
  axios: defaultPluginConfig(pkgName, {
    default: {
      requestInterceptorsHandler: defaultRequestInterceptor,
      responseInterceptorsHandler: defaultResponseInterceptor,
      timeout: 5 * 1000,
    },
    client: {},
  }),
}

此时,在app上挂载的axios对象,就是默认实例。获取默认实例:

js
// 直接获取
this.app.axios
// 通过方法获取
this.app.axios.getInstance()

单实例

单实例配置:

js
// config/config.xxx.js
module.exports = {
  axios: {
    client: {
      headers: {
        common: {
          'Content-Type': 'application/json; charset=UTF-8',
        },
      },
      timeout: 6000,
    },
  }
}

因为只挂载一个实例,可以像默认配置那样,基于axios对象或者getInstance方法获取实例:

js
class EggAxiosController extends Controller {
  /**
   * 获取挂载的单实例
   */
  async getSimpleInstance() {
    const { app } = this

    // 直接获取
    this.app.axios
    // 通过方法获取
    this.app.axios.getInstance()
    await app.axios.getInstance()
  }
}

多实例

多实例配置:

js
module.exports = {
  axios: {
    clients: {
      axios1: {
        headers: {
          common: {
            'Content-Type': 'application/json; charset=UTF-8',
          },
        },
        timeout: 7000,
        instanceName: 'axios1',
      },
      axios2: {
        headers: {
          common: {
            'Content-Type': 'application/json; charset=UTF-8',
          },
        },
        timeout: 8000,
        instanceName: 'axios2',
      },
    },
  }
}

由于插件挂载了多个axios实例,在获取实例时,只能通过实例名称获取。

js
class EggAxiosController extends Controller {
  /**
   * 获取挂载的多个实例
   */
  async getMultipleInstance() {
    const { app } = this
    const axios1Instance = await app.axios.getInstance('axios1')
    const axios2Instance = await app.axios.getInstance('axios2')
    // xxx...
  }
}

单元测试

参考

证书

MIT

Copyright (c) 2019-present, @142vip 储凡

仅供学习参考,商业使用请保留作者版权信息,作者不保证也不承担任何软件的使用风险。