import type { Request, Response } from 'express'; type Options = { /** * 接口延迟时间,单位 `ms`。 * * @default 100 */ delay?: number; /** * 响应数据发送方式。常见的有 `res.send` `res.end` 等。 * * @default 'send' */ sendMethod?: string; /** * 格式化响应数据。 * * 如果 `sendMethod='end'`,默认值为 `JSON.stringify`。 * * @param data 响应数据 * @returns 处理后的响应数据 */ format?: (data: Record) => any; /** * 自定义基础数据结构。 * * @default { * code: '0000', // 错误码 * message: 'mock success' // 错误信息 * } */ responseBasic?: Record; /** * 自定义分页数据结构。 * * @param pageData 单页数据 * @param key 自定义分页数据键名。有些场景需要自定义分页数据键名。默认 `data` * @returns * @default (pageData = {}, key = 'data') => ({ * pageNum: 1, // 当前页码 * pageSize: 10, // 每页条数 * 'total|15-100': 20, // 总条数 * 'pages|2-10': 2, // 总页数 * [`${key}|10`]: [pageData] // 响应数据 * }); */ responsePage?: (pageData?: Record, key?: string) => Record; }; type MockParam = Request, TResponse extends Record = Response> = Record | ((req: TRequest, res: TResponse) => Promise>); /** * mock 工具类 * * @param {Object} [options] 配置项 * @example * const mockUtil = new MockUtilClass({ * // 默认配置 * delay: 100, * sendMethod: 'send', * responseBasic: { code: '0000', message: 'mock success' }, * responsePage(pageData, key = 'data'){ * return { * pageNum: 1, * pageSize: 10, * 'total|15-100': 20, * 'pages|2-10': 2, * [`${key}|10`]: [pageData] * } * } * }); * * await mockUtil.mockData({ data: { icp: '@icp' } })(req, res); * // 内部调用 res.send({ code: '0000', message: 'mock success', data: { icp: '陕ICP备69861741号' } }) * * await mockUtil.mockPageData({ icp: '@icp' })(req, res); * // 内部调用 res.send({ code: '0000', message: 'mock success', pageNum: 1, pageSize: 10, total: 32, pages: 6, data: [ { icp: '陕ICP备69861741号' }, { icp: '闽ICP备82861788号' } ] }) * * // 文件下载 * await mockUtil.mockData((req, res) => { * res.setHeader('Access-Control-Expose-Headers', '*'); * res.setHeader('Content-Type', 'image/jpeg'); * res.setHeader('Content-Disposition', 'attachment;filename=120x120.jpg'); * res.sendFile('path/to/120x120.jpg'); * })(req, res); */ declare class MockUtilClass = Request, TResponse extends Record = Response> { options: Options; constructor(options?: Options); /** * 生成一个异步函数。内部调用发送响应数据方法(数据结构是创建实例时传入的 `responseBasic`)。可以直接传给 node http 服务。 * * 响应数据支持 `Mockjs` 的语法规范。 * * @param data 响应数据 * @returns * - 如果参数是回调函数(异步),且返回值不是对象,则直接返回该值。 * - 如果参数是对象或回调函数(异步)返回值是对象,则返回一个包含 `Mockjs` 语法的响应数据。 * @example * const mockUtil = new MockUtilClass(); * await mockUtil.mockData({ data: { icp: '@icp' } })(req, res); * // 内部调用 res.send({ code: '0000', message: 'mock success', data: { icp: '陕ICP备69861741号' } }); * * // 文件下载 * await mockUtil.mockData((req, res) => { * res.setHeader('Access-Control-Expose-Headers', '*'); * res.setHeader('Content-Type', 'image/jpeg'); * res.setHeader('Content-Disposition', 'attachment;filename=120x120.jpg'); * res.sendFile('path/to/120x120.jpg'); * })(req, res); */ mockData(data?: MockParam): (req: TRequest, res: TResponse) => Promise; /** * 生成一个异步函数。内部调用发送分页数据方法(分页数据结构是创建实例时传入的 `responsePage`)。可以直接传给 node http 服务。 * * 响应数据支持 `Mockjs` 的语法规范。 * * @param pageData 单页数据 * @param key 自定义分页数据键名。有些场景需要自定义分页数据键名。默认 `data` * @returns * @example * const mockUtil = new MockUtilClass(); * await mockUtil.mockPageData({ icp: '@icp' })(req, res); * // 内部调用 `res.send({ code: '0000', message: 'mock success', pageNum: 1, pageSize: 10, total: 32, pages: 6, data: [ { icp: '陕ICP备69861741号' }, { icp: '闽ICP备82861788号' } ] })` */ mockPageData(pageData?: Record, key?: string): (req: TRequest, res: TResponse) => Promise; } export default MockUtilClass;