# Mock 数据

Mock 数据是前端开发过程中必不可少的一环，是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口，模拟请求数据甚至逻辑，能够让前端开发独立自主，不会被服务端的开发所阻塞。

## 约定式 Mock 文件

Fes.js 约定 `./mock.js` 为 mock 文件。

比如：

```
.
├── mock.js
└── src
    └── pages
        └── index.vue
```

## 编写 Mock 文件

可以参考如下 🌰：

```js
export default function ({ cgiMock, mockjs, utils }) {
    const { Random } = mockjs;

    // 测试 proxy 与 mock 用例集合
    cgiMock('/movie/in_theaters_mock', (req, res) => {
        res.send(
            JSON.stringify({
                code: '0',
                msg: '',
                result: {
                    text: 'movie:  movie/in_theaters_mock ~~~~~',
                },
            }),
        );
    });
    cgiMock('/movie/test_mock', (req, res) => {
        res.send(
            JSON.stringify({
                code: '0',
                msg: '',
                result: {
                    text: 'mock:  movie/test_mock',
                },
            }),
        );
    });

    // 测试用例: mock.js change，重现请求，需要能拉最新的数据
    cgiMock('/watchtest', (req, res) => {
        res.send(
            JSON.stringify({
                code: '0',
                msg: '',
                result: {
                    text: '通过 register 测试 mock watch: 初始状态',
                },
            }),
        );
    });

    // 返回一个数字
    // cgiMock('/number', 666);
    cgiMock('/number', 999);

    // 返回一个json
    cgiMock({
        url: '/json',
        result: {
            code: '400101',
            msg: "不合法的请求:Missing cookie 'wb_app_id' for method parameter of type String",
            transactionTime: '20170309171146',
            success: false,
        },
    });

    // 利用 mock.js 产生随机文本
    cgiMock('/text', Random.cparagraph());

    // 返回一个字符串 利用 mock.js 产生随机字符
    cgiMock(
        '/random',
        mockjs.mock({
            'string|1-10': '★',
        }),
    );

    // 正则匹配url, 返回一个字符串
    cgiMock(/\/abc|\/xyz/, 'regexp test!');

    // option.result 参数如果是一个函数, 可以实现自定义返回内容, 接收的参数是是经过 express 封装的 req 和 res 对象.
    cgiMock(/\/function$/, (req, res) => {
        res.send('function test');
    });

    // 返回文本 readFileSync
    cgiMock('/file', utils.file('./package.json'));

    // 更复杂的规则配置
    cgiMock({
        url: /\/who/,
        method: 'GET',
        result(req, res) {
            if (req.query.name === 'kwan') {
                res.json({ kwan: '孤独患者' });
            } else {
                res.send('Nooooooooooo');
            }
        },
        headers: {
            'Content-Type': 'text/plain',
            'Content-Length': '123',
            ETag: '12345',
        },
        cookies: [
            {
                name: 'myname',
                value: 'kwan',
                maxAge: 900000,
                httpOnly: true,
            },
        ],
    });

    // 携带参数的请求
    cgiMock('/v2/audit/list', (req, res) => {
        const { currentPage, pageSize, isAudited } = req.body;
        res.send({
            code: '0',
            msg: '',
            data: {
                currentPage,
                pageSize,
                totalPage: 2,
                totalCount: 12,
                pageData: Array.from({ length: pageSize }, () => ({
                    title: Random.title(),
                    authorName: Random.cname(),
                    authorId: Random.name(),
                    createTime: Date.now(),
                    updateTime: Date.now(),
                    readCount: Random.integer(60, 1000),
                    favoriteCount: Random.integer(1, 50),
                    postId: '12323',
                    serviceTag: '业务类型',
                    productTag: '产品类型',
                    requestTag: '需求类型',
                    handleTag: '已采纳',
                    postType: 'voice',
                    postStatus: isAudited ? 'pass' : 'auditing',
                    auditStatus: 'audit1',
                })),
            },
        });
    });

    // multipart/form-data 类型
    cgiMock('/v2/upload', (req, res) => {
        res.send({
            code: '0',
            msg: '文件上传成功',
        });
    });
}
```

### cgiMock 参数

创建一个 mock 接口，参数非常灵活，参考上面的 demo 即可。

### mockjs 参数

[Mock.js](http://mockjs.com/) 是常用的辅助生成模拟数据的三方库，借助他可以提升我们的 mock 数据能力。

比如：

```js
export default function ({ cgiMock, mockjs, utils }) {
    cgiMock(
        '/random',
        mockjs.mock({
            'string|1-10': '★',
        }),
    );
}
```

### utils 参数

工具函数：

-   utils.file(path)，从项目根目录根据 path 寻找文件，返回文件流。

## 配置 Mock

详见配置 [mock](../reference/config/#mock)。

## 关闭 Mock

可以通过配置关闭。

```js
export default {
    mock: false,
};
```
