mockx - 一个nodejs编写的http|https代理服务器。只需简单的配置就能实现复杂的代理需求。 可以用来做数据mock,线上资源代理等。
Features:
- 替换远程请求到本地文件
- 支持反向代理
- 模拟慢速网络
- 可修改请求头和响应头
- 自动创建证书
- 支持HTTP和HTTPS
- 工作原理
- Example & Usage
- Use Cases
- webpack本地开发
- 替换线上的某个url下内容
- 同时代理一批接口
- query不同返回不同内容
- 指定发送的headers或者返回的headers
- Options说明
- Options.rule说明
- 请求有关的字段
- 响应有关的字段
- 辅助的字段
time ==>
-----------------------
server: 4
-------------/-\-------
hoxy: 3 5
-----------/-----\----
hosts: 2 \
---------/---------\---
client: 1 6
- 客户端发起请求
- hosts文件返回IP 127.0.0.1
- 到监听80端口的mockx服务,查找匹配的规则再转给服务器或本地
- 服务器端收到请求并发送响应数据
- mockx接收并加工数据
- 客户端收到响应内容
注:
- mockx是运行在本地80端口的服务器,即127.0.0.1:80
- mockx在有域名映射时,会修改hosts文件添加域名映射到127.0.0.1
完整的项目请见mockx-example
项目的目录结构如下
1 安装mockx
npm install mockx
2 启动mockx
在项目根目录下执行sudo node_modules/.bin/mockx
因为mockx是监听在80端口,因此要使用sudo
权限。
如果第一次执行,会在项目根目录下创建mockx.config.js
,即mockx的配置文件。
3 修改mockx.config.js
配置文件
module.exports = {
//
// 需要代理的域名
//
domains: [
's.taobao.com'
],
//
// mock文件夹
//
mockDir: './mock',
//
// 所有的映射规则,详见后面rule编写规则
//
rules: [
// 映射本地json
{
pathname: '/mockJSON',
json: 'jsonfile.json'
},
// 映射本地的静态文件
{
pathname: '/mockFile',
file: 'file.html' // file静态资源,可以是js,css,html
},
// 映射一个远程的内容
{
pathname: '/mockRemote',
remote: 'http://www.taobao.com' // remote需要写全,把协议http:带上
}
]
}
4 访问
http://localhost/mockJSON
或s.taobao.com/mockJSON
都将返回mock/jsonfile.json
内容
下面默认的配置是这样的,因此只写了rules
module.exports = {
// 需要映射的域名
domains: [
],
// 相对项目根目录下的mock文件夹
mockDir: './mock',
// 所有的映射规则,详见后面rule编写规则
rules: [
]
}
一般webpack开发是在8080
端口,通过localhost:8080/index.html
来调试。
当需要mock/api/message/list
这样的接口时。我们的思路是都通过localhost来访问,未命中的地址再转发到localhost:8080
。
因此我们就通过访问localhost/index.html
来测试。
{
rules: [
{
pathname: '/api/message/list',
file: 'messageList.json'
},
{
pathname: /.*/,
host: 'localhost',
remote: 'localhost:8080$0'
}]
}
localhost/index.html
会转发到localhost:8080/index.html
localhost/api/message/list
会转发到mock/messageList.json
替换线上的某个url下内容,排查线上的bug。如https://s.taobao.com/search?q=40530
注:
- 此时需要在domains里添加一条host
s.taobao.com
,mockx启动时会自动在hosts文件中添加一条127.0.0.1 s.taobao.com
{
domains: [
's.taobao.com'
],
rules: [
{
pathname: '/search',
file: 'search.html'
},
{
pathname: /.*/,
remote: 'origin' // origin即原封不动转发,访问`s.taobao.com/api/message`会转到线上真正的`s.taobao.com/api/message`服务
}]
}
/api/message/list
,/api/message/create
,/api/message/get
这样一批接口需要代理。我们的pathname支持正则,同时在响应字段中有$n
代表正则里的()
分组正则表达式在url里匹配到的内容。
{
rules: [
{
pathname: /\/api\/message\/(.*)/i,
file: '$1.html'
}
}
访问/api/message/list
会映射到本地的`mock/list.json
有时需要根据query不同来返回不同内容,使用query字段。
{
rules: [
{
pathname: '/api/message/create',
query: {
title: 'xxx'
},
json: 'success.json'
},
{
pathname: '/api/message/create',
query: {
title: 'xxxxxxxxxxxxxxxxxxxxx'
},
json: 'error.json'
}]
}
指定响应头,如静态资源跨域的Access-Control-Allow-Origin
。
指定请求头,如在本地模拟登陆的用户信息cookie
{
rules: [
{
pathname: '/\/api\/message\/(.*)/i',
remote: 'http://taobao.com/api/message/create'
// 指定响应头
responseHeaders: {
Access-Control-Allow-Origin: '*'
}
// 指定请求头
requestHeaders: {
cookie: 'NID=102=W21YoOeFkN6ndgJ_ZPQfa12YpMYdLm8Oxcy_QBg5zyQILhQDDhWdWMFBeyzZQmo8FsuykQNCJezRN_WfJ9m9e644dkd9_nH1yVbk2B9LvhL8hYpufpYe39VFvfcKHBa6DzTKKeije1Adlrrf3nw36LMPkDrYA1e1xG4lV4Inr05TCzIzQ6VJcTKudZtY27Kp; DV=UtKgBvHhB6IVLh52YHJ4EGP2UPZItwI; UULE=a+cm9sZToxIHByb2R1Y2VyOjEyIHByb3ZlbmFuY2U6NiB0aW1lc3RhbXA6MTQ5MzExMzE4ODQwOTAwMCBsYXRsbmd7bGF0aXR1ZGVfZTc6MzAyODE4MDY0IGxvbmdpdHVkZV9lNzoxMjAwMTkwNjEyfSByYWRpdXM6MTA3MjYw'
}
}]
}
- domains 需要进行代理的域名
- mockDir 相对于根目录的mock映射文件夹,一般填入
./mock
- rules 映射的规则
- pathname 匹配的url路径,支持正则和字符串。即标准url中的pathname一致。要以'/'开头。
- query 匹配的get或post的数据,post字段覆盖get字段,如果填了在query也匹配时才会命中此配置。注:(note: query中k-v的value必须是字符串)
- host 匹配的host
例如https://s.taobao.com/search?q=40530
这样解析出来的几部分
pathname
-> '/search'
host
-> 's.taobao.com'
'query' -> {q: '40530'}
- json 映射的json文件 json文件支持mockjs
- jsData 映射的动态执行的js文件
- remote 映射的远程资源 映射时请写全带上协议,如
http://taobao.com
,如果填入origin
则是原内容转发 - file 映射的静态文件,可以是
html
,js
,css
NOTE:json
,jsData
,remote
,file
在一条规则中只能选其中一个
- jsonp jsonp请求,字段value是jsonp的字段名如
{jsnop: 'callback'}
- delay 延时的响应时间,毫秒单位