npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@forchange/mock

v0.3.4

Published

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

Downloads

171

Readme

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 文件

参数

示例

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

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

简单方法

内置列表

| 参数 | 解释 | 返回数据类型 | 示例 | | :----------: | :--------: | :----------: | :----------------------------------: | | @id | id(8 位) | string | 64669287 | | @name | 姓名 | string | 李健龙 | | @province | 省份 | string | 湖北省 | | @phoneNumber | 电话号码 | string | 13888888888 | | @number | 1-100 整数 | number | 2 | | @price | 价格 | number | 388.00 | | @weekday | 星期 | string | Monday | | @month | 月份 | string | January | | @recentDate | 最近时间 | date | 2019-08-06T06:46:32.360Z | | @futureDate | 未来时间 | date | | | @pastDate | 过去时间 | date | | | @avatar | 头像 | string | | | @animals | 动物图片 | string | | | @sentences | 段落 | string | | | @lines | 一行文本 | string | | | @boolean | 布尔值 | boolean | true | | @uuid | uuid | string | 5c9b344b-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 | 数量 | 否 | number | 3 | | 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