ya-driver
Version:
The driver support Ya GUI or Ya cli. docker image
122 lines (112 loc) • 3.64 kB
JavaScript
/**
* Setup mock server
*/
const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const Mock = require('mockjs');
const rapnode = require('rap-node-plugin');
const Project = require('./project');
const {
defaultMockServerPort,
localhost
} = require('../config/vars');
const {
log,
error
} = require('../utils/log');
const {
isPortTaken
} = require('../utils/helper');
module.exports = function (options) {
const project = new Project(options.projectPath); // 放置project相关信息
const {
mockPath,
application
} = project;
const dataSourceDir = mockPath;
const mockApp = express();
mockApp.use(bodyParser.json({
limit: '1mb'
})); // 这里指定参数使用 json 格式
mockApp.use(bodyParser.urlencoded({
extended: true
}));
// Ya Remote mock
const rapConfig = {
host: '192.168.49.96', // 启动的服务主机
port: '10010', // 端口号
// mock: '/mymockjsurl/', // RAP前缀
wrapper: '' // 不需要包装
};
global.RAP_FLAG = 1; // 开启RAP
function mockToRap(req, res) {
const projectId = req.query.projectId || req.body.projectId;
// 如果请求地址包含.json
// if(/\.json/.test(req.url)) {
if (!projectId) {
let data = '{}';
let filePath = dataSourceDir + '/' + req.url + '.js';
try {
data = fs.readFileSync(filePath, 'utf8');
} catch (evt) {
filePath = dataSourceDir + '/' + req.url + '.json';
data = fs.readFileSync(filePath, 'utf8');
}
// 自定义mock数据占位符
Mock.Random.extend({
requestBody: function () {
return req.body;
}
});
// eval方式解析处理复杂数据类型
data = eval('(' + data + ')'); // eslint-disable-line
// 将req.body插入到每一个含有Funciton类型的deep对象里
const insertDeep = function (data) {
Object.keys(data).forEach((key) => {
if (Object.prototype.toString.call(data[key]) === '[object Function]') {
data['__request_body__'] = req.body;
}
if (Object.prototype.toString.call(data[key]) === '[object Object]') {
insertDeep(data[key]);
}
if (Object.prototype.toString.call(data[key]) === '[object Array]') {
data[key].forEach((item) => {
insertDeep(data[key]);
});
}
})
};
insertDeep(data);
res.json(Mock.mock(data));
// let data = require('./mock' + req.url.replace(/\/mock/g, ''))
// if(data) res.json(data)
} else {
// mock数据并输出
rapnode.getRapData(Object.assign({}, rapConfig, {
url: req.url,
projectId: projectId
}), function () {
}, function (err, data) { // eslint-disable-line
if (data) {
res.json(data);
}
});
}
}
mockApp.get('/*', mockToRap);
mockApp.post('/*', mockToRap);
const port = options.mockPort || application.mockPort || defaultMockServerPort; // local mock server port
const uri = `http://${localhost}:${port}`;
isPortTaken(port, (err, flag) => {
if (flag) { // 被占用直接回调
error('Mock error', `Mock server startup failed, the port ${port} maybe in use.`);
options.callback && options.callback();
} else {
mockApp.listen(port, () => {
log(`Mock Server runing at: ${uri}`);
options.callback && options.callback();
});
}
});
};