Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 1,000,000+ packages pre-installed, including @forchange/mock with all npm packages installed. Try it out:

var mock = require("@forchange/mock")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

@forchange/mock v0.3.4

基于 koa 的本地 mock 服务 - 长链接 - socket - 自定义错误状态 - 接口之间的隔离 - 接口之间可以联动处理(数据传递) - 简单易用,容易扩展

Mock

npm version

mock 自定义规则、流程的数据模拟服务

特点

  • mock 方式多样化,支持 json 和 function
  • 隔离接口,容易维护,适合开源协作
  • 接口联动处理,可根据业务流程自定义返回数据
  • 文件路径即是路由和方法,接口唯一,更好的开发体验
  • 支持 webSocket,连接、断开、主动推送消息 等操作可视化

快速开始

安装

安装 node 环境

$ brew install node

安装 mock 服务

$ npm install -g @forchange/mock

开始

初始化:

$ fmock init
$ cd <输入的文件名>

启动:

$ fmock

现在,访问 http://0.0.0.0:3839/user/info 查看接口

如何使用

配置 config

config 文件是整个服务的配置文件 详细说明

添加 data

data 文件是接口对应的返回数据 详细说明

添加 rule

当我们构造 data 数据时,将会提供部分 内部方法
当你需要自定义 data 的返回数据时,可通过 rule 文件配置 详细说明

添加 label

为了防止数据文件间的冲突,我们提供 label 标识 详细说明

添加 flow

当你需要进行接口间的数据联动时,可添加 flow 流程 详细说明

示例目录结构

mock
├── config.js                           //config 配置入口
├── data                                //data 数据
│   └── ambassador
│       ├── courses
│       │   └── {id}
│       │       └── {pay}#get.js
│       ├── courses#get.js
│       ├── settlements
│       │   └── search.js
│       └── settlements#get.js
├── socket                              //socket 数据
│   ├── aaa.js
│   ├── access.js
│   ├── cun.js
│   ├── kkk
│   │   └── bbb.js
│   └── promise.js
└── rule.js                             //自定义规则


命令

常用指令

选项:
  create <path> [-l <label>] [-m <method>]  [-s]
    path           路径
    -l, --label    label 标签
    -s             是否为 socket 数据
    -m, --method   method of mock http

  init             快速开始

  -c, --config     config file of mock
  --host           host of mock
  -p, --port       port of mock http
  -d, --directory  directory of mock http

  -v, --version    显示版本号
  -h, --help       显示帮助信息

示例:
  fmock init
  fmock

启动 mock 服务

$ fmock -c ./mock/config

新建文件

默认创建 http 服务 data 文件
当添加 -s 指令时创建 socket 服务 data 文件

$ fmock create ./aaa/bbb -m '方法名'

注意: 由于在 windows 下创建文件时不支持冒号:,因此我们在创建文件时将会把 /:id 转化为 /{id},并同时对两者进行了解析支持。

config

新建

添加 config.js 文件

参数

参数 解释 数据类型 示例
host string ip ‘0.0.0.0’
http port number http 服务端口 3839
directory string http 数据文件路径 ‘./data’
middleware array 自定义中间件 []
rule string 自定义规则 ‘./rule.js’
tls httpsPort number https 端口 443
key string 密钥
cert string 证书
socket port number socket 服务端口 3838
directory string socket 自定义回复文件 ‘./socket’
label string 自定义 label ‘xindongdong’

示例

module.exports = {
  host: "0.0.0.0",
  http: {
    port: 8888,
    directory: "./data",
    middleware: ["a"],
    rule: "./rule.js",
    tls: {
      httpsPort: 443,
      key: "aaa",
      cert: "111"
    }
  },
  socket: {
    port: 3838,
    directory: "./socket"
  },
  label: "chenle"
};

data

新建

添加 data 文件夹,按照以下规则新建文件

规则

  • 一个接口一个文件
  • 文件路径即路由和方法

示例

路由:/ambassador/courses/{id}/{pay}
方法:GET

mock
├── data
│   └── ambassador
│       ├── courses
│       │   └── {id}
│       │       └── {pay}#get.js

数据定义

JSON 数据

我们将会直接获取到定义的 data 数据。

示例

exports.data = {
  errcode: 0,
  errmsg: "ok",
  data: {
    a: "@number",
    b: "2",
    c: [1, 2, 3],
    d: "@string",
    type: {
      __rule__: "@enum", // 枚举
      params: ["数组", "b", "c"]
    }
  }
};

function

在 function 中,你可以构造你想要的数据、状态等任何你需要的结构。

示例

exports.data = async (ctx, next) => {
  ctx.status = 200;
  ctx.body = {
    aaa: 123,
    bbb: 234
  };
  await next();
};

内部 rule

在构造数据时,我们提供部分内部方法供你快速定义数据

简单方法

内置列表

参数解释返回数据类型示例
@idid(8 位)string64669287
@name姓名string李健龙
@province省份string湖北省
@phoneNumber电话号码string13888888888
@number1-100 整数number2
@price价格number388.00
@weekday星期stringMonday
@month月份stringJanuary
@recentDate最近时间date2019-08-06T06:46:32.360Z
@futureDate未来时间date
@pastDate过去时间date
@avatar头像string
@animals动物图片string
@sentences段落string
@lines一行文本string
@boolean布尔值booleantrue
@uuiduuidstring5c9b344b-a589-4efd-9c95-17508c0c0087

示例

exports.rules = {
  books: {
    a: "@number",
    b: "2",
    c: [1, 2, 3],
    d: "@string"
  }
};

复杂方法

复杂方法中,需要用参数进行配置,参数说明如下:

参数解释是否必填数据类型示例
__rule__标识string'@list'
params参数object

内置列表

参数解释返回数据类型示例
@enum枚举string/number
@list数组/数组对象array

列表详情

list:列表方法,返回一定长度的列表,params 中定义以下参数

参数解释是否必填数据类型示例
number数量number3
payload子数据任意类型

示例

exports.rules = {
  classrooms: {
    __rule__: "@list",
    params: {
      number: 3,
      payload: {
        name: "@name"
      }
    }
  }
};

enum:枚举方法,返回定义的枚举之一,params 定义如下

参数解释是否必填数据类型示例
params参数array

示例

exports.rules = {
  types: {
    __rule__: "@enum",
    params: [1, "@string", 3]
  }
};

自定义 rule

非必须项,不需要可跳过

新建

添加 rule.js 文件

添加规则

  • config 中添加 rule 字段
  • 通过 key-value 的方式添加规则,其中 key 为规则名,value 为方法

简单规则

既可以直接返回 number、 string 等基本类型,也可以返回 function高级类型

基本类型示例

module.exports = {
  houses: {
    a: 123,
    b: "@string"
  }
};

高级类型示例

module.exports = {
  houses: function() {
    return {
      3: 3,
      4: 4
    };
  }
};

复杂规则

当我们需要在方法中传递参数时,我们就需要使用复杂规则

示例

module.exports = {
  houses: function(params) {
    let payload = params.payload;
    let number = params.number || 1;
    return {
      payload,
      number
    };
  }
};

此时的参数 params 便是我们在定义 data 数据 时添加的参数

组合使用

内置规则和自定义规则可以组合使用,进行数据构造

示例

定义规则:

module.exports = {
  houses: function() {
    return {
      3: {
        __rule__: "@list",
        params: {
          payload: {
            a: "@avatar"
          }
        }
      },
      4: 4
    };
  }
};

组合使用:

exports.data = {
  errcode: 0,
  errmsg: "",
  data: {
    a: "@houses",
    b: "2",
    c: [1, 2, 3],
    d: "@string",
    type: {
      __rule__: "@enum", // 枚举
      payload: ["数组", "b", "c"]
    },
    orders: {
      name: "cheaa",
      ids: {
        __rule__: "@list", // 原子数组
        number: 10,
        payload: {
          id: "@number",
          name: "@string",
          rooms: [1, 3],
          books: {
            __rule__: "@list",
            number: 4,
            payload: {
              tags: {
                __rule__: "@enum",
                payload: [1, 2, 3]
              }
            }
          }
        }
      }
    }
  }
};

接口作用域规则

你可以在定义 data 数据 时添加当前接口作用域下的自定义规则

exports.rules = {
  a: function() {
    return 1;
  }
};

exports.data = {
  data: {
    name: "forchange",
    desc: "@a"
  }
};

label

通过添加 label 标识,处理数据间的冲突问题 label 字段对 http 服务和 socket 服务均支持

新建

config 中添加 label 字段
新建文档时添加 -l 指令指定 label 或者手动添加 &<你的 label 名>

示例

新建

$ fmock create './aaa/bbb' -l 'xindongdong'

你将会生成

mock
├── data
│   └── aaa
│       ├── bbb#get&xindongdong.js

flow

特殊情况下,可能需要在多个接口之间进行数据的联动处理,你可以在定义 data 数据时添加 flow 字段

规定

  • 当上一次请求和当前请求中 flow 定义的 methodroute 匹配时,我们会返回 flow 中定义的 data 数据
  • 如果当前 flow 字段中没有 data 字段我们将会强制返回本次请求的 data 数据,并抛出警告。

结构

[]{method, route, data}

参数解释是否必填数据类型
method方法string
route路由string
data强制返回的数据object

示例

exports.flow = [
  {
    method: "get",
    route: "/ambassador/courses",
    data: {
      a: "/ambassador/courses",
      b: 234
    }
  },
  {
    method: "get",
    route: "/ambassador/settlements",
    data: {
      a: "/ambassador/settlements",
      b: 234
    }
  }
];

middleware

新建

如果你需要自定义 middleware,你需要在 config 中添加 middleware 字段

示例

middleware: [
    async (ctx, next) => {
        console.log('中间件运行 🐸🐸')
        await next()
    },
    async (ctx, next) => {
        console.log('中间件运行 🐸🐸')
        await next()
    }
]

socket

启动 socket 服务

你可以在 config 中添加 socket 字段开启 socket 服务

示例

socket: {
    port: 端口号
}

连接

当 socket 服务启动后,我们可以通过 ws://host: 端口号/任意路由 进行连接

管理

当我们开启 socket 服务后,我们能通过 host: 端口号/ 查看到所有 socket 连接情况
你可以在此页面上进行连接、断开、发送消息等一系列操作,如图

添加自定义回复

你可以在 config socket 字段中添加 directory 字段处理 socket 自定义回复文件

添加 socket 文件夹

我们规定:

  • 文件路径即是你的路由(连接),如 /aaa 连接下对应的文件名为 aaa.js
  • 一个文件对应一种回应方式

示例

module.exports = async message => {
  return {
    name: "forchange",
    message: message
  };
};

添加 label

参考 label

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free