From 0cccac38f70837cb1c676b76d6eb2399a055d7f3 Mon Sep 17 00:00:00 2001 From: tianxuan Date: Fri, 5 Feb 2021 15:03:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20mock=E6=8F=92=E4=BB=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?pr=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/plugins/commands/mock/index.js | 131 +++++++++--------- packages/fes-template/mock.js | 2 +- 2 files changed, 67 insertions(+), 66 deletions(-) diff --git a/packages/fes-preset-built-in/src/plugins/commands/mock/index.js b/packages/fes-preset-built-in/src/plugins/commands/mock/index.js index c76ab0af..753931c2 100644 --- a/packages/fes-preset-built-in/src/plugins/commands/mock/index.js +++ b/packages/fes-preset-built-in/src/plugins/commands/mock/index.js @@ -5,7 +5,6 @@ import bodyParser from 'body-parser'; import cookieParser from 'cookie-parser'; import Mock from 'mockjs'; - export default (api) => { let mockFlag = false; // mock 开关flag let mockPrefix = '/'; // mock 过滤前缀 @@ -21,58 +20,56 @@ export default (api) => { } }); - const createMock = () => { - // 判断是否为 Object,仅 {} - function isObject(value) { - return Object.prototype.toString.call(value) === '[object Object]'; + // 对 array、object 遍历处理 + function traversalHandler(val, callback) { + if (lodash.isArray(val)) { + val.forEach(callback); } - // 对 array、object 遍历处理 - function traversalHandler(val, callback) { - if (lodash.isArray(val)) { - val.forEach(callback); - } - if (isObject(val)) { - Object.keys(val).forEach((key) => { callback(val[key], key); }); - } - } - // 根据参数个数获取配置 - function getOption(arg) { - const len = arg.length; - // 默认配置 - const option = { - headers: { - 'Cache-Control': 'no-cache' - }, - statusCode: 200, - cookies: [], - timeout: 0 - }; - if (len === 0) return option; - if (len === 1) { - const newOption = arg[0]; - if (isObject(newOption)) { - traversalHandler(newOption, (value, key) => { - if (key === 'headers') { - traversalHandler(newOption.headers, (headervalue, headerkey) => { - option.headers[headerkey] = newOption.headers[headerkey]; - }); - } else { - option[key] = newOption[key]; - } - }); - } - } else { - option.url = arg[0]; - option.result = arg[1]; - } - return option; - } - // 把基于 cgiMockfile 的相对绝对转成绝对路径 - function parsePath(value) { - const PROJECT_DIR = process.env.PWD || process.cwd(); - return resolve(PROJECT_DIR, value); + if (lodash.isPlainObject(val)) { + Object.keys(val).forEach((key) => { callback(val[key], key); }); } + } + // 根据参数个数获取配置 + function getOption(arg) { + const len = arg.length; + // 默认配置 + const option = { + headers: { + 'Cache-Control': 'no-cache' + }, + statusCode: 200, + cookies: [], + timeout: 0 + }; + if (len === 0) return option; + if (len === 1) { + const newOption = arg[0]; + if (lodash.isPlainObject(newOption)) { + traversalHandler(newOption, (value, key) => { + if (key === 'headers') { + traversalHandler(newOption.headers, (headervalue, headerkey) => { + option.headers[headerkey] = newOption.headers[headerkey]; + }); + } else { + option[key] = newOption[key]; + } + }); + } + } else { + option.url = arg[0]; + option.result = arg[1]; + } + return option; + } + + // 把基于 cgiMockfile 的相对绝对转成绝对路径 + function parsePath(value) { + const PROJECT_DIR = process.env.PWD || api.cwd; + return resolve(PROJECT_DIR, value); + } + + const createMock = () => { const requestList = []; const cgiMock = (...arg) => { const option = getOption(arg); @@ -83,11 +80,9 @@ export default (api) => { return readFileSync(parsePath(file)); }; - // mock是否打开 - mockFlag = isObject(api.config.mock) ? true : api.config.mock; - if (!mockFlag) return; // mock打开情况下,配置的过滤前缀 - mockPrefix = api.config.mock.prefix || mockPrefix; + const mockPrefixTemp = api.config.mock.prefix || mockPrefix; + mockPrefix = mockPrefixTemp === mockPrefix ? mockPrefixTemp : `${mockPrefixTemp}/`; // mock文件处理 mockFile = parsePath('./mock.js'); if (!existsSync(mockFile)) { @@ -97,21 +92,24 @@ export default (api) => { if (require.cache[mockFile]) { delete require.cache[mockFile]; } - const projectMock = require(mockFile); - if (!lodash.isFunction(projectMock)) { - api.logger.info('mock.js should export Function'); return; + // require最新的 mock.js 文件 + try { + const projectMock = require(mockFile); + if (!lodash.isFunction(projectMock)) { + api.logger.info('mock.js should export Function'); return; + } + projectMock({ cgiMock, Mock }); + } catch (err) { + api.logger.info('mock.js run fail!'); } - // mock对象与 mock.js 结合 - projectMock(cgiMock, Mock); return (req, res, next) => { - // 如果请求不是以 cgiMock.prefix 开头,直接 next `${mockPrefix}/` - if (!req.path.startsWith(`${mockPrefix}/`)) { + // 如果请求不是以 cgiMock.prefix 开头,直接 next + if (!req.path.startsWith(mockPrefix)) { return next(); } - // 请求以 cgiMock.prefix 开头,匹配处理 - const matchRequet = requestList.filter(item => req.path.search(item.url) !== -1)[0]; + const matchRequet = requestList.find(item => req.path.search(item.url) !== -1); if (!matchRequet) { return next(); } @@ -135,7 +133,7 @@ export default (api) => { if (lodash.isFunction(matchRequet.result)) { matchRequet.result(req, res); } else if ( - lodash.isArray(matchRequet.result) || isObject(matchRequet.result) + lodash.isArray(matchRequet.result) || lodash.isPlainObject(matchRequet.result) ) { !matchRequet.type && res.type('json'); res.json(matchRequet.result); @@ -147,9 +145,11 @@ export default (api) => { }; api.onStart(() => { - loadMock = createMock(); + // 获取mock配置: 是否打开 + mockFlag = lodash.isPlainObject(api.config.mock) ? true : api.config.mock; if (!mockFlag) return; + loadMock = createMock(); chokidar.watch(mockFile, { ignoreInitial: true }).on('change', () => { @@ -157,6 +157,7 @@ export default (api) => { loadMock = createMock(); }); }); + api.addBeforeMiddlewares(() => { if (!mockFlag) return []; return [ diff --git a/packages/fes-template/mock.js b/packages/fes-template/mock.js index b48cd9dc..31323115 100644 --- a/packages/fes-template/mock.js +++ b/packages/fes-template/mock.js @@ -1,4 +1,4 @@ -module.exports = (cgiMock, Mock) => { +module.exports = ({ cgiMock, Mock }) => { const { Random } = Mock; // 测试 proxy 与 mock 用例集合