mock 服务器, 开箱即用,无需重启,自动代理远程服务、提供静态web服务入口、零接入成本 零接入成本、一秒启动服务、 在非prod阶段减轻运维部署成本、 去除对后端服务依赖性 前端、测试可自定义伪接口,http请求或配合postman 等工具可以直接调试伪接口
- mock 服务器, 开箱即用,读取本地mock文件、自动代理远程服务,本地直接返回mock服务的ip即可, 查询不到mock文件会自动代理请求proxyURL配置的线上(ip/域名)
- 提供对mock文件 增 、删、改、查功能
- 提供js、json mock 文件互相转换功能 (可以通过命令、已可以使用文档中的函数形式自定义转换)
- 启动命令时候添加配置 --scan 经过本mock服务器的接口都可以扫描接口的数据生成到本地
- 小提示
- 已经兼容已测试过 node >= v14.21.3可以正常运行, 库开发使用 node v18.19.0 推荐 node >= 18.19.0
- 项目packages.json type 为 module 可能会导致不能正常运行,可是试着删除packages 中的type或者改成commonjs
- node
$ npm i @enhances/mock-server -D 或者 pnpm add @enhances/mock-server -D
-
mock
启动服务 -
mock:5300
启动服务自定义服务端口 -
jsToJson
js文件转json文件 -
jsonToJs
json文件转js文件 -
mock:scan
扫描接口的数据生成到本地 具体配置看mock-config.js scan字段
{
"scripts": {
"mock": "enhances-mock start",
"mock:scan": "enhances-mock start --scan true",
"mock:5300": "enhances-mock start -p 5300",
"jsToJson": " enhances-mock jsToJson -c 来源文件夹路径 -o 输出的文件夹路径",
"jsonToJs": " enhances-mock jsonToJs -c 来源文件夹路径 -o 输出的文件夹路径"
}
}
- mock-config.js
// 覆盖默认配置
const { MockServerJs } = require('@enhances/mock-server');
module.exports = {
model: 'remote', // remote | local 强制使用本地(local)或者远程代理模式(remote)默认 auto
proxyURL: {
async format(api) {
const url = MockServerJs.utils.defineProxy({
'^/api': {
target: 'http://192.168.0.151:8888',
pathRewrite: {}
}
}, api);
if (!/^http:|^https:/.test(url)) {
// 这里判断处理没有匹配到接口
return 'http://localhost' + url;
}
return url;
}
},
staticServic: ['dist'],
interceptors: {
// 请求拦截
async request(data) {
return data;
},
// 响应拦截
async response(data) {
return data;
}
},
}
const { MockServerJs } = require('@enhances/mock-server');
module.exports = {
timeout: 300, // 延迟
model: 'auto', // remote | local 强制使用本地(local)或者远程代理模式(remote)默认 auto
// node-logger-plus 控制打印的配置
loggerConfig: {
log: true,
debug: true,
info: true,
warn: true,
error: true,
table: true,
},
fileWithEnd: '.js', // mock 的文件 目前只兼容 js 文件, json 文件可以通过 jsonToJs 命令转换为 js
mockSrc: '__mock__', // 读取mock的目录
/**
* @desc 启动命令时候添加配置 --scan 可以启动扫描线上接口生成到本地
* @example
* enhances-mock start --scan true
*/
scan: {
/**
* @desc 最终输出的路径
* @param {string} path 扫描的路径
* @returns {string} 最终的输出路径
* @default __mock__/.remotes/{扫描的路径}
*/
outputChunk: function (url) {
return path.join('__mock__', '.remotes', url)
},
/**
* @desc 输出的文件格式 '.json' | '.js'
* @default js
*/
format: '.js',
},
logDir: '__mock__', // 打印日志保存的目录
logFileName: 'log', // 日志文件名称
logReplaceMaxSize: 1024 * 1024, // 日志最大的覆盖内容大小, 大于这个大小(Bytes)内容将会被覆盖
staticServic: ['public'], // 在cwd下开放为静态服务目录
proxyURL: {
origin: 'https://xxxx/xxx.com', // 通过配置 proxyURL 代理请求线上
async format(api) {
const url = MockServerJs.utils.defineProxy({
'^/api': {
target: this.origin,
pathRewrite: {
"/api": "/newApi"
}
},
'^/service/api': {
target: 'http://localhost:21412',
pathRewrite: {}
}
}, api);
if(!/^http:|^https:/.test(url)) {
// 这里判断处理没有匹配到接口
return 'http://localhost' + url;
}
return url;
}
},
interceptors: {
// 请求拦截
async request(data) {
// 0.2.14版本后会有自动处理host delete data.headers.host; 操作
return data;
},
// 响应拦截
async response(data) {
return data;
}
}
}
- 配置访问链接为例:
http://localhost:60363/custom-public/index.js
- 目录结构
- mock-config.js
- public
-index.js
- 配置文件
// `mock-config.js`
module.exports = {
staticServic: [{
suffix: '/custom-public',
dir: 'public',
}]
}
- 需要动态的文件固定写法:
${id}.js
- 例如创建 mock 目录
__mock__/xxx/xxxx/${id}.js
- 接口:
/education/getToken
- 根据 mockSrc为 mock
- 在运行根目录创建 mock 目录
__mock__/education/getToken.js
// getToken.js
exports.enabled = true; // true 代表使用本地mock false 使用代理
/**
* @params {{ 'query': object, 'body': object, 'headers': object, '_parsedUrl': object }} req
* @params {object} res
*/
exports.mock = (req, res) => {
return {
status: 200,
message: 'mock'
}
}
exports.enabled = true;
exports.mock = (_, res) => {
res.setHeader('content-disposition', 'filename="xxxxxx"') // 设置响应头
.status(200) // 设置响应状态
.send("响应的数据") // 设置响应体
}
- mock 提供的参数如下
/**
* @params {{ 'query': object, 'body': object, 'headers': object, '_parsedUrl': object }} req exporess request
* @params {object} res exporess response
*/
exports.mock(req, res): boolean;
- __mock__
- list.js
- add.js
- update.js
- delete
- ${id}.js
list.js
exports.enabled = true;
exports.mock = () => ({
"errcode": 0,
"errmsg": "ok",
"data": {
"records": [
{
id: '123',
name: 'name123',
}
],
},
});
- 文件
delete/${id}.js
const { MockServerJs } = require('@enhances/mock-server');
exports.enabled = true;
exports.mock = async (req) => {
const result = await MockServerJs.share.update(
__dirname,
'../list.js', // 现对路径
(source) => {
// source 这个是 list.js 页面 mock 函数返回的数据
source.data.records = source.data.records.filter(record => record.id != req.query.id);
// 返回数据会写入 list.js 的mock 函数里面
return Promise.resolve(source)
});
return {
errcode: 0,
errmsg: 'ok',
data: result,
}
}
- 文件
add.js
const { MockServerJs } = require('@enhances/mock-server');
exports.enabled = true;
exports.mock = async (req) => {
const result = await MockServerJs.share.update(
__dirname,
'./list.js', // 现对路径
(source) => {
// source 这个是 list.js 页面 mock 函数返回的数据
source.data.records.push({
id: Math.random() * 1000, // 随机生成一个id
...req.body, // 接口新增的参数
});
// 返回数据会写入 list.js 的mock 函数里面
return Promise.resolve(source)
});
return {
errcode: 0,
errmsg: 'ok',
data: result,
}
}
- 文件
update.js
const { MockServerJs } = require('@enhances/mock-server');
exports.enabled = true;
exports.mock = async (req) => {
const result = await MockServerJs.share.update(
__dirname,
'./list.js', // 现对路径
(source) => {
// source 这个是 list.js 页面 mock 函数返回的数据
source.data.records = source.data.records.map((record) => {
if(req.body.id === record.id) {
return {
...record,
...req.body,
}
}
return record;
})
// 返回数据会写入 list.js 的mock 函数里面
return Promise.resolve(source)
});
return {
errcode: 0,
errmsg: 'ok',
data: result,
}
}
-
js
转json
const { MockServerJs } = require('@enhances/mock-server');
MockServerJs.utils.jsToJson('来源文件夹路径', '输出的文件夹路径');
-
json
转js
const { MockServerJs } = require('@enhances/mock-server');
MockServerJs.utils.jsonToJs('来源文件夹路径', '输出的文件夹路径');
-
jsonToJs
和jsToJson
第三个参数
const { MockServerJs } = require('@enhances/mock-server');
console.log(MockServerJs.utils.transformTemplates); // 默认的过滤模板。 通过对应类型的函数进行换行
MockServerJs.utils.jsonToJs('来源文件夹路径', '输出的文件夹路径', (data) => {
// 自定义数据格式
return data;
});
- 获取本机ip
getLocalIP
const { MockServerJs } = require('@enhances/mock-server');
MockServerJs.utils.getLocalIP(); // get local IP
- 打印彩色文本的函数
printInColor
const { MockServerJs } = require('@enhances/mock-server');
// color 可选:reset red green yellow blue magenta cyan white
MockServerJs.utils.printInColor([{ color: 'green', text: 'text' } ]);
// 或者使用
MockServerJs.utils.logger2.success('Mock server config file changed update options end');
- 编辑mock文件
MockServerJs.share.update
- 看上面编辑mock文件的例子
- 联系邮箱@840719708@qq.com