为前端项目定制的简易的 API mock 工具:
/a/b/c
,则对应的文件名应当为 a_b_c.js
req.query/req.body
处理不同的返回内容;res.status(200).send(content)
,res.status(403).send('禁止访问')
(模拟出错)mockdata
目录为常用的公共 API,会提交至 GIT 仓库customdata
目录为本地自定义 API,不会提交至 GIT 仓库customdata/autosave
目录为自动保存的 APIundefined
、或者 __ignore_mock__
${config.mockFileDir}/customdata
目录${config.mockFileDir}/mockdata
目录${config.mockFileDir}/mockdata/autosave
目录autosave
目录中process.env.MOCKAPI_ENABLE=mock
process.env.MOCKAPI_AUTOSAVE=save
process.env.MOCKAPI_AUTOSAVE_FORCE=force
示例,开启 mock 功能,开启自动保存 API 至自定义目录:
set MOCKAPI_ENABLE=mock
set MOCKAPI_AUTOSAVE=save
npm run dev
npm i -save-dev @lzwme/simple-mock
# 或者使用 yarn
yarn add -D @lzwme/simple-mock
/express/app.js
中注入相关逻辑:/**
* 接口代理配置与mock
*/
const apiMock = require('@lzwme/simple-mock');
app.all('/{api,rest}/**', function(req, res) {
// 开发模式下且可 mock 的情况
if (appConfig.media === 'dev' && apiMock.render(req, res)) {
return;
}
console.log('[apiProxy]', req._parsedUrl.pathname);
apiProxy.web(req, res, {target: config[proxyTarget]});
});
// 在代理返回时,注入 saveApi 方法
apiProxy.on('proxyRes', function (proxyRes, req, res) {
apiMock.saveApi(req, res, proxyRes.headers['content-encoding']);
});
simple-mock-config.js
(后续介绍)环境变量重要用于开启或关闭相关功能。其开启功能的优先级高于 simple-mock-config.js
中的配置。
// 开启MOCK功能
process.env.MOCKAPI_ENABLE=mock
// 开启自动保存API返回内容
process.env.MOCKAPI_AUTOSAVE=save
// 强制每次请求都保存API返回内容(未开启MOCK功能时有效,一般不推荐开启)
process.env.MOCKAPI_AUTOSAVE_FORCE=force
项目根目录 simple-mock-config.js
为配置文件,应自行创建,并配置 .gitignore
中忽略它,以便于随时修改 mock 行为。主要示例配置参考:
module.exports = {
mockFileDir: 'mock', // path.reslove(process。cwd(), 'mock'), // 指定 mock 文件存放的目录
isEnableMock: false, // 是否开启 Mock API 功能
isAutoSaveApi: false, // 是否自动保存远端请求的 API
isForceSaveApi: false, // 是否强制保存,否则本地有时不再保存
// 自动保存 API 返回内容时,对内容进行过滤的方法,返回为 true 才保存
fnAutosaveFilter(content) {
// 示例: 不保存 content.data.length = 0 的数据
// if (content && Array.isArray(content.data) && !content.data.length) {
// return false;
// }
return true;
}
}
render(req, res, apiPath)
判断一个请求是否可 mock,如果满足条件则执行 mock 逻辑。
应在 nodejs 服务中,插入代理转发前,返回为 true
则表示可 mock,否则为不 mock,应继续走代理转发逻辑。
saveApi(req, res, contentEncoding)
用于请求返回时,是否保存返回的 API 信息。用于后端 API 代理转发信息返回时注入。
关闭 mock 功能,开启自动保存API功能:
process.env.MOCKAPI_ENABLE=N
process.env.MOCKAPI_AUTOSAVE=save
编辑该 API 对应的 mock 文件,将返回值改为 __ignore_mock__
。如果需要根据参数来处理,也是可以实现的,示例:
// 忽略mock
module.exports = '__ignore_mock__';
// or
module.exports = req => {
const query = Object.assign({}, req.query, req.body);
// id 为 1 则不 mock
if (+query.id === 1) {
return '__ignore_mock__';
}
return {...};
}
这种情况一般为,登陆信息为 mock 返回,session 无效或不存在,转发至后端登陆认证失败,API 请求自然也不会成功。
此时可关闭 mock 功能,正常登陆一次,再开启mock;也可关闭登陆相关 API 的 mock。
当 customdata 目录下有符合的规则时,会优先使用,否则则使用 mockdata 下的规则定义。因此,删除 customdata 目录下的定义文件即可。
还有一种办法,就是在该目录下的文件中导出值为 undefined
:
module.exports = void(0);
undefined
与 __ignore_mock__
的区别?undefined
会跳过当前文件的 mock 作用 __ignore_mock__
会终止本次请求的 mock 行为删除相关文件,或开启强制保存功能。
mockdata
(会提交至GIT),以共享使用customdata
目录下建立对应文件并书写 MOCK 逻辑,此时一般导出为一个函数customdata
中定义不同参数的返回逻辑,并开启自动保存API功能,在 autosave
目录得到不同参数请求的结果,然后在自定义中快速书写不同参数返回不同的数据mockdata
,提交至 GIT 仓库