fix: mock插件修改pr问题

This commit is contained in:
tianxuan 2021-02-05 15:03:13 +08:00
parent f576e406cc
commit 906dc665d7
2 changed files with 67 additions and 66 deletions

View File

@ -5,7 +5,6 @@ import bodyParser from 'body-parser';
import cookieParser from 'cookie-parser'; import cookieParser from 'cookie-parser';
import Mock from 'mockjs'; import Mock from 'mockjs';
export default (api) => { export default (api) => {
let mockFlag = false; // mock 开关flag let mockFlag = false; // mock 开关flag
let mockPrefix = '/'; // mock 过滤前缀 let mockPrefix = '/'; // mock 过滤前缀
@ -21,58 +20,56 @@ export default (api) => {
} }
}); });
const createMock = () => { // 对 array、object 遍历处理
// 判断是否为 Object仅 {} function traversalHandler(val, callback) {
function isObject(value) { if (lodash.isArray(val)) {
return Object.prototype.toString.call(value) === '[object Object]'; val.forEach(callback);
} }
// 对 array、object 遍历处理 if (lodash.isPlainObject(val)) {
function traversalHandler(val, callback) { Object.keys(val).forEach((key) => { callback(val[key], key); });
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);
} }
}
// 根据参数个数获取配置
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 requestList = [];
const cgiMock = (...arg) => { const cgiMock = (...arg) => {
const option = getOption(arg); const option = getOption(arg);
@ -83,11 +80,9 @@ export default (api) => {
return readFileSync(parsePath(file)); return readFileSync(parsePath(file));
}; };
// mock是否打开
mockFlag = isObject(api.config.mock) ? true : api.config.mock;
if (!mockFlag) return;
// mock打开情况下配置的过滤前缀 // mock打开情况下配置的过滤前缀
mockPrefix = api.config.mock.prefix || mockPrefix; const mockPrefixTemp = api.config.mock.prefix || mockPrefix;
mockPrefix = mockPrefixTemp === mockPrefix ? mockPrefixTemp : `${mockPrefixTemp}/`;
// mock文件处理 // mock文件处理
mockFile = parsePath('./mock.js'); mockFile = parsePath('./mock.js');
if (!existsSync(mockFile)) { if (!existsSync(mockFile)) {
@ -97,21 +92,24 @@ export default (api) => {
if (require.cache[mockFile]) { if (require.cache[mockFile]) {
delete require.cache[mockFile]; delete require.cache[mockFile];
} }
const projectMock = require(mockFile); // require最新的 mock.js 文件
if (!lodash.isFunction(projectMock)) { try {
api.logger.info('mock.js should export Function'); return; 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) => { return (req, res, next) => {
// 如果请求不是以 cgiMock.prefix 开头,直接 next `${mockPrefix}/` // 如果请求不是以 cgiMock.prefix 开头,直接 next
if (!req.path.startsWith(`${mockPrefix}/`)) { if (!req.path.startsWith(mockPrefix)) {
return next(); return next();
} }
// 请求以 cgiMock.prefix 开头,匹配处理 // 请求以 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) { if (!matchRequet) {
return next(); return next();
} }
@ -135,7 +133,7 @@ export default (api) => {
if (lodash.isFunction(matchRequet.result)) { if (lodash.isFunction(matchRequet.result)) {
matchRequet.result(req, res); matchRequet.result(req, res);
} else if ( } else if (
lodash.isArray(matchRequet.result) || isObject(matchRequet.result) lodash.isArray(matchRequet.result) || lodash.isPlainObject(matchRequet.result)
) { ) {
!matchRequet.type && res.type('json'); !matchRequet.type && res.type('json');
res.json(matchRequet.result); res.json(matchRequet.result);
@ -147,9 +145,11 @@ export default (api) => {
}; };
api.onStart(() => { api.onStart(() => {
loadMock = createMock(); // 获取mock配置: 是否打开
mockFlag = lodash.isPlainObject(api.config.mock) ? true : api.config.mock;
if (!mockFlag) return; if (!mockFlag) return;
loadMock = createMock();
chokidar.watch(mockFile, { chokidar.watch(mockFile, {
ignoreInitial: true ignoreInitial: true
}).on('change', () => { }).on('change', () => {
@ -157,6 +157,7 @@ export default (api) => {
loadMock = createMock(); loadMock = createMock();
}); });
}); });
api.addBeforeMiddlewares(() => { api.addBeforeMiddlewares(() => {
if (!mockFlag) return []; if (!mockFlag) return [];
return [ return [

View File

@ -1,4 +1,4 @@
module.exports = (cgiMock, Mock) => { module.exports = ({ cgiMock, Mock }) => {
const { Random } = Mock; const { Random } = Mock;
// 测试 proxy 与 mock 用例集合 // 测试 proxy 与 mock 用例集合