api-mock-handler

1.0.0 • Public • Published

AMH

基于 axiosmockjs 的 API 控制工具.

功能

  • 基于 API 定义生成请求代理.
  • 提供全局、命名空间、接口三种层级的 mock 控制.
  • 允许自定义所使用的请求库,默认为 axios.
  • 允许为请求自定义发起方法.

安装

使用 npm:

$ npm install api-mock-handler

使用

创建实例

import amh from 'api-mock-handler'
 
const instance = amh.create({
    interface: {
        user: {
            mock: true,
            baseURL: '/api/user',
            login: {
                url: '/login',
                method: 'post'
            },
            logout: {mock: false}
        }
    },
    mock: true,
    mocker: {
        user: {
            login ({body}) {
                // this 指向 mockjs 实例
                const {username} = JSON.parse(body)
             return {code: 200, msg: '', data: {username}}
            }
        }
    }
})

此时 instance 将会代理如下两个接口:

[{
   url: '/api/user/login',
    method: 'post',
    mock: true
  }, {
    url: '/api/user/logout',
    method: 'get',
    mock: false
  }]

调用接口

instance.user.login({
    data: {username: 'admin'}
}).then(res => res.data)
    .then(data => {
    console.dir(data)
})
 
// {code: 200, msg: '', data: {username: 'admin'}}
 
instance.user.logout()
 .catch(error => console.error(error))
// 

该接口将会被 mock ,而模拟数据的产生由 mocker.user.login 函数定义。

创建实例的参数

{
    interfaces: object, // 
    mock: boolean, //  false
    mocker: object, //  mock  true 
    requester: function, //  axios
    onRequest: function, // 
    concatPath: function, // 
    debug: boolen, //  false
}
  • interfaces 接口列表,由全局 baseURL 与一组命名空间组成:

    {
        baseURL: string, // 
        [...namespace]
    }

    命名空间,由 baseURLmock与一组接口组成:

    {
        baseURL: string, // 
        mock: boolean, //  false true  mock  false  mock 
        [...interface]
    }

    接口,组成:

    {
        url: string, // 
        mock: boolean, //  false mock 
        method: string, //  get
        meta: object, // 
    }
  • mock 用于声明是否开启 mock 功能。

  • mocker 若某个命名空间中某个接口设置了 mock 参数为 true,则需要在此参数中设置同命名空间、同接口名的处理函数,否则会报错。

  • requester 发起请求的请求库,默认为 axios。

  • onRequest 定义如何发起请求,函数签名为:

    (config, args, requester) => {}

    对于调用(下称 call):

    instance.user.login({data: {username: 'admin'}})

    onRequest 函数响应如下:

    (config, args, requester) => {
        /**
         * config: {
         *   url: '/api/user/login',
         *   method: 'post',
         *   meta: {} 
         * }
         * 
         * args: [{
         *   data: {username: 'admin'}
         * }]
         *
         * requester: axios (未设置 requester 的情况下)
         */
        return {} // 此函数返回结果即为 call 的返回结果
    }
  • concatPath 默认的路径拼接行为:

    (baseURL, url) => url[0] === '/' ? `${baseURL}${url}` : `${baseURL}/${url}`
  • debug 开启后,将会在以下情形输出一些信息:

    • 没有为命名空间设置 baseURL

      Warn: The namespace [${namespace}] does not set baseURL!
    • 提示你为某个命名空间打开了 mock 开关

      Info: You turned on the mock option for the namespace [${namespace}]
    • 成功为某个接口绑定了 mock 处理函数

      Info: Bind the mock function for interface [${namespace}.${_interface_name_}]

当发生以下情况时将会报错:

  • 开启了全局 mock 却未提供 mocker

    You have enabled mock mode but don't provide mocker.
  • 为某个接口开启了 mock 却没有在 mocker 中提供相应的处理函数

    You turned on the mock option for interface [${namespace}.${_interface_name_}] but did not provide the corresponding handler in the mocker.
  • 当你尝试使用一个不存在的命名空间时

    The definition of namespace [${namespace}] could not be found.
  • 当你尝试使用一个不存在的接口时

    The definition of interface [${namespace}.${_interface_name_}] could not be found.

注意事项

关于 Mockjs

  • 此工具的 mock 功能由 mockjs 实现,因此请不要在项目中自行引入 mockjs,否则会导致 mockjs 重复创建 xhr 的代理,导致死循环。

  • 可以通过 amh.Mock 获取 mockjs 实例。

Readme

Keywords

Package Sidebar

Install

npm i api-mock-handler

Weekly Downloads

1

Version

1.0.0

License

MIT

Unpacked Size

9.57 kB

Total Files

3

Last publish

Collaborators

  • krun